如何从对象的`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的主要内容,如果未能解决你的问题,请参考以下文章

按值返回值而不等待所有值返回异步 C#

如何获取对象的非限定(短)类名?

怎么通过ajax从后台获取json数据

2016-6-3Ajax异步复习

如何从 .map 循环返回以从 API 获取数据 [重复]

如何在 javascript 中使用 aynsc/await 从异步操作返回对象