javascript - 如何在不返回 Promise 的情况下从对象的 `get()` 获取异步数据

标签 javascript asynchronous async-await getter-setter defineproperty

在 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 我都会得到,

undefined

因为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))

关于javascript - 如何在不返回 Promise 的情况下从对象的 `get()` 获取异步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54881525/

相关文章:

javascript - 调用函数时在主页上显示警报

javascript - 未安装节点 v8.2.0(64 位)

javascript - Angular 异步管道卡在 promise 上

javascript - 搜索一种用另一个值替换 test 的方法

javascript - 获取 AngularJs 中的特定元素

c# - await 不会按预期使用 StreamReader.ReadToEndAsync() 返回给调用者

ios - 完成处理程序和返回值

c# - 为什么调用方方法和异步方法具有相同的线程 ID

rust - 如何通过特征委派具有非静态参数的异步函数?

c# - 我应该始终完成 TaskCompletionSource 吗?