8

我想定义一个只读对象属性,它异步获取一个值,然后使用新的 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

4

3 回答 3

6

如今,异步操作通常由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/

于 2016-01-27T14:21:10.700 回答
3

感谢@utkanos 的帮助。

JavaScript 不会异步返回 getter 函数的值,因为 getter 是同步的。

于 2012-08-07T11:24:58.567 回答
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);
};
于 2012-08-07T11:29:19.843 回答