在吸气异步函数w /返回回调(Async Function in Getter w/ Return

2019-09-20 22:41发布

我想定义一个只读对象属性异步取一个值,然后使用新的EcmaScript 5个干将返回。

然而,属性总是返回undefined即使magicValue在下面的示例代码是明确从未不确定。 此外,当我刚return 'xxx'; 打印的值仍然是undefined 。 它只有当我的工作return回调函数之外。

好像return被立即执行,无论回调是否myAsyncFunction被调用。 我不知道我是否该错误在V8或者如果我滥用JavaScript的干将。
我能得到这个工作? 我想,既然我可以使用getter和setter现在,我将使用getter / setter方法来读取和写入性能和定期的功能做某些任务。

var User = function (id) {
    this.id = id;
};

Object.defineProperty(User.prototype, 'magic', {
    get : function () {
        myAsyncFunction(function (magicValue) {
            return magicValue;
        });
    }
});

var u = new User(5);
console.log(u.magic);

打印undefined

Answer 1:

异步操作,这些天,通常与处理的承诺 。 当你调用你的getter,它返回一个承诺,你可以将回调使用的“那么()”方法。

Object.defineProperty(User.prototype, "magic", {
  get: function() {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(JSON.stringify({
          magic: 'value'
        }));
      }, 1000);
    });
  }
});

这是一个工作示例: https://jsfiddle.net/tw6gaudz/2/



Answer 2:

感谢@utkanos您的帮助。

JavaScript就无法acynchronously返回一个getter函数的值,因为干将是同步的。



Answer 3:

你可以使用一个“二传手”:

var User = function (id) {
    this.id = id;
};

Object.defineProperty(User.prototype, 'magic', {
    set : function (value) {
        setTimeout(value.bind(0, "hello"), 1000);
        return true;
    }
});

var a = new User(5);

a.magic = function(msg){
    alert(msg);
};


文章来源: Async Function in Getter w/ Return in Callback