71

ES6 クラスのゲッターが ES2017 の await / async 関数から値を返すようにすることは可能ですか。

class Foo {
    async get bar() {
        var result = await someAsyncOperation();

        return result;
    }
}

function someAsyncOperation() {
    return new Promise(function(resolve) {
        setTimeout(function() {
            resolve('baz');
        }, 1000);
    });
}

var foo = new Foo();

foo.bar.should.equal('baz');
4

4 に答える 4

60

更新:他の人が指摘したように、これは実際には機能しません。@kuboon には、以下の回答で優れた回避策があります。

あなたはこれを行うことができます

class Foo {
    get bar() {
        return (async () => {
            return await someAsyncOperation();
        })();
    }
}

これも同じです

class Foo {
    get bar() {
        return new Promise((resolve, reject) => {
            someAsyncOperation().then(result => {
                resolve(result);
            });
        })
    }
}
于 2016-09-08T10:00:51.357 に答える
18

await呼び出し側で値を取得できます。

class Foo {
    get bar() {
        return someAsyncOperation();
    }
}
async function test(){
  let foo = new Foo, val = await foo.bar;
  val.should.equal('baz');
}
于 2018-11-09T05:27:52.940 に答える
16

プロミスのみが可能awaitで、async関数はプロミス自体を返します。
もちろん、getter はそのような promise を生成することもできます。通常の値と何の違いもありません。

于 2015-11-23T19:49:39.707 に答える
2

getter によって返される値については、async関数はいずれにしても a を返すため、これは何も変更しませPromiseん。await関数内でのみ使用できるため、これが問題になるのはasync関数内です。

await関数で問題が発生した場合は、次のようにします。

get property () {
  const self = this; // No closure with `this`, create a closure with `self`.
  async function f () { // `async` wrapper with a reference to `self`
    const x = await self.someFunction(); // Can use `await`
    // the rest with “self” in place of “this”
    return result;
  }
  return f(); // Returns a `Promise` as should do an `async get`
}
于 2020-04-21T23:22:35.517 に答える