Javascript Getter中的异步函数和回调中的返回
我想定义一个只读对象属性,该属性异步获取一个值,然后使用新的EcmaScript 5获取程序返回该值 但是,该属性始终返回Javascript Getter中的异步函数和回调中的返回,javascript,node.js,v8,ecmascript-5,Javascript,Node.js,V8,Ecmascript 5,我想定义一个只读对象属性,该属性异步获取一个值,然后使用新的EcmaScript 5获取程序返回该值 但是,该属性始终返回未定义,即使下面的示例代码中的magicValue从未定义过。另外,当我只返回'xxx'时打印值仍然未定义。仅当I返回在回调函数之外时,它才起作用 似乎无论是否调用了myAsyncFunction的回调,都会立即执行return。 我不确定这是V8中的一个bug,还是滥用了JavaScript的getter。 我能让它工作吗?我想,既然我现在可以使用getter和setter
未定义
,即使下面的示例代码中的magicValue
从未定义过。另外,当我只返回'xxx'时代码>打印值仍然未定义
。仅当I返回
在回调函数之外时,它才起作用
似乎无论是否调用了myAsyncFunction
的回调,都会立即执行return
。
我不确定这是V8中的一个bug,还是滥用了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);
打印未定义的
谢谢@utkanos的帮助
JavaScript不会异步返回getter函数的值,因为getter是同步的。您可以使用“setter”:
现在,异步操作通常是用。当您调用getter时,它返回一个承诺,您可以使用'then()'方法附加回调
以下是一个工作示例:
不能将异步函数的结果返回到同步操作-这是一种不合逻辑的构造。此外,您的myAsyncFunction
永远不会被调用——它只是声明的。异步操作的本质是什么?上面的代码只是一个示例。真正的目的是用户拥有一个名为“帐户”的属性。当访问account属性并且用户还没有帐户时,将首先创建一个帐户,然后返回它?但是getter是一个同步操作。你不能从getter返回异步的东西-你需要一个不同的模式。不-getter是同步的,所以会立即返回(或不返回)。好吧,我认为你是对的。你说的有道理。我想我会用一个正则函数来代替。感谢您的帮助:)有没有办法避免承诺并使用async
和await
?@adelriosantiago:async/await在下面使用承诺。您可以使用异步函数并等待getter。以下是使用async/await的修改版本:
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);
};
Object.defineProperty(User.prototype, "magic", {
get: function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(JSON.stringify({
magic: 'value'
}));
}, 1000);
});
}
});