如何从对象的`get()`获取异步数据而不返回Promise
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从对象的`get()`获取异步数据而不返回Promise相关的知识,希望对你有一定的参考价值。
在NodeJS中,我有一个像这样的对象,
var scope = { word: "init" };
使用Object.defineProperty as described in MDN我重写get()
函数是这样的,
Object.defineProperty(scope, 'word', {
get: function() {
return Math.random();
}
});
每当我在控制台中使用scope.word
时,它会正确返回一个新的随机数。但是,该函数还必须从具有回调函数获取数据。所以它的工作方式非常像setTimeout
,
Object.defineProperty(scope, 'word', {
get: function() {
setTimeout(() => {
return Math.random();
}, 1000)
}
});
现在每次我做scope.word
我得到,
未定义
因为get()
函数是同步的。这当然可以通过返回Promise来解决,
Object.defineProperty(scope, 'word', {
get: function() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(Math.random());
}, 1000)
});
}
});
但后来我需要做scope.word.then(...)
,但我们正在构建的背后的整个想法是开发人员只需要scope.word
就好像它是一个简单易用的变量。就像Angular的$ scope或VUE.js'数据'一样。
如何让get()
函数返回实际值,而不是Promise?是否有可能使用async
/ await
解决方法?怎么样?
答案
其中一个解决方案就是像这样传递回调函数。
const scope = {}
Object.defineProperty(scope, 'word', {
value: (cb)=>{
setTimeout(() => {
cb(Math.random())
}, 1000)
}
});
scope.word(res=>console.log(res))
以上是关于如何从对象的`get()`获取异步数据而不返回Promise的主要内容,如果未能解决你的问题,请参考以下文章