Getter中的异步函数w /回调中的返回

Max*_*eng 7 javascript v8 node.js ecmascript-5

我想定义一个只读对象属性,该属性异步获取一个值,然后使用新的EcmaScript 5 getter返回它.

但是,undefined即使magicValue在下面的示例代码中明确地永远不会定义,属性也会始终返回.另外,当我只是return 'xxx';打印值仍然是undefined.它仅在我return在回调函数之外时才有效.

return无论是否调用回调,似乎都会立即执行myAsyncFunction.我不确定这是V8中的错误,还是我滥用JavaScript的getter.
我可以让这个工作吗?我想,既然我现在可以使用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);
Run Code Online (Sandbox Code Playgroud)

打印undefined.

Rou*_*ski 6

如今,异步操作通常由Promises处理。当您调用 getter 时,它会返回一个承诺,您可以使用“then()”方法附加一个回调。

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

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