Javascript Getter中的异步函数和回调中的返回

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

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

但是,该属性始终返回
未定义
,即使下面的示例代码中的
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);
    });
  }
});