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

时间:2012-08-07 10:07:06

标签: javascript node.js v8 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);

打印undefined

3 个答案:

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