JavaScript で Promiseを返す非同期/同期的に動作する複数の関数を並列に呼び出し、その結果を取得する

JavaScript で Promiseを返す関数を並列に呼び出しその結果を取得するには、Promise.all と Array#map を併用し、
const values = await Promise.all([fn, fn, fn].map(fn => fn()) のようにします。

(async() => {
  const fn = (index) => {
    return new Promise(resolve => {
      setTimeout(() => resolve(index), 1000 * index);
    });
  };

  const process = async() => {
    console.log(`fn call begin`);

    const source = [ fn, fn, fn ];
    const values = await Promise.all(source.map((fn, index) => {
      console.log(`fn[${index}] called`);
      return fn(index);
    }));

    console.log(`fn call end`);

    return values; // [ 0, 1, 2 ]
  };

  console.log(`values ${await process()}`); // log(`values 0,1,2`)
})();
fn call begin
fn[0] called
fn[1] called
fn[2] called
fn call end
values 0,1,2
  • イテレータや Array like Object を Promise.all に渡す場合は、 await Promise.all(Array.from(iter).map(...)) とします。

  • 同期関数の結果を Promise.all に渡す場合は Promise.resolve(sync_fn()) のようにして Promise でラップします。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.