8

非同期的に値をフェッチし、新しい EcmaScript 5 ゲッターを使用してそれを返す読み取り専用オブジェクト プロパティを定義したいと考えています。

ただし、以下のコード例では決して未定義ではありませんがundefined、プロパティは常に返されます。magicValueまた、return 'xxx';印刷された値だけが静止しているときundefinedreturnコールバック関数の外にいる場合にのみ機能します。

のコールバックが呼び出されたreturnかどうかに関係なく、すぐに実行されているようです。myAsyncFunctionこれが V8 のバグなのか、JavaScript のゲッターを悪用しているのかはわかりません。
これを機能させることはできますか?ゲッターとセッターを使用できるようになったので、ゲッター/セッターを使用してプロパティと通常の関数を読み書きし、特定のタスクを実行すると思いました。

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で処理されます。ゲッターを呼び出すと、「then()」メソッドを使用してコールバックをアタッチできる promise が返されます。

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 はゲッター関数の値を非同期的に返すことはありません。

于 2012-08-07T11:24:58.567 に答える
1

「セッター」を使用できます。

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 に答える