1. ホーム
  2. javascript

[解決済み] コールバックが戻るのを "待つ "方法とは?

2022-06-24 16:04:58

質問

以下の例のような単純なコールバックを使用する場合。

test() {
  api.on( 'someEvent', function( response ) {
    return response;
  });
}

この関数をasync / awaitを使用するように変更するにはどうしたらよいでしょうか? 具体的には、'someEvent' が一度だけ呼ばれることが保証されていると仮定すると、関数テストは、次のようにコールバックが実行されるまで返さない非同期関数にしたいと思います。

async test() {
  return await api.on( 'someEvent' );
}

どのように解決するのですか?

async/await は魔法ではありません。非同期関数はPromiseのアンラップを代行してくれる関数なので api.on() でPromiseを返さなければなりません。このようなものです。

function apiOn(event) {
  return new Promise(resolve => {
    api.on(event, response => resolve(response));
  });
}

次に

async function test() {
  return await apiOn( 'someEvent' ); // await is actually optional here
                                      // you'd return a Promise either way.
}


しかし、それも嘘です。なぜなら、非同期関数はそれ自体もプロミスを返すので、実際には test() の値を実際に取得するのではなく、値のためのPromiseを取得し、それをこのように使うことができるのです。

async function whatever() {
  // snip
  const response = await test();
  // use response here
  // snip
}