我想定义一个只读对象属性,该属性异步获取一个值,然后使用新的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);
打印undefined
。
答案 0 :(得分:3)
感谢@utkanos的帮助。
JavaScript不会异步返回getter函数的值,因为getter是同步的。
答案 1 :(得分:3)
目前,异步操作通常由Promises处理。当你调用你的getter时,它返回一个promise,你可以使用'then()'方法附加一个回调。
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/
答案 2 :(得分:1)
您可以使用“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);
};