Getter中的asynchronous函数在callback中返回

我想定义一个只读对象属性,它asynchronous获取一个值,然后使用新的EcmaScript 5 getters返回它。

但是,即使下面的示例代码中的magicValue明确永远不会定义,属性总是返回undefined。 另外,当我只是return 'xxx'; 打印的值仍然是undefined 。 它只在我returncallback函数之外时才起作用。

看起来不pipe是否调用myAsyncFunction的callback,立即执行return 。 我不确定这是V8中的错误,还是滥用JavaScript的获取者。
我可以得到这个工作吗? 我想,因为我现在可以使用getter和setter,所以我将使用getters / 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

目前asynchronous操作通常使用Promises进行处理。 当你调用你的getter时,它会返回一个promise,你可以使用'then()'方法附加一个callback。

 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/

感谢@utkanos的帮助。

JavaScript不会asynchronous返回一个getter函数的值,因为getters是同步的。

你可以使用“setter”:

 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); };