TypeScript で複数の非同期処理の結果を後続の処理で使うには

複数の非同期処理を並列で実行して、全て終わったらその結果を処理する場合の書き方になります。

【Promise.all】全て成功で終わったら処理する

async function main() {
  // 非同期処理を5個作成
  const procs = Array
    .from({ length: 5 })
    .map((_, i) => new Promise<number>((resolve) => {
      const seq = i + 1;
      if (seq % 2 === 1) {
        // 奇数個番目の処理なら、何番目か返す
        resolve(seq);
      }
      else {
        // 偶数個番目の処理なら、10倍で返す
        resolve(seq * 10);
      }
    }));

  const results = await Promise.all(procs);
  console.log(results);
}
main();

非同期処理が返した値が results に配列で渡されるので、コンソール出力は

[ 1, 20, 3, 40, 5 ]

【Promse.allSettled】全て終わったら処理する

Promise.all では、実行した非同期処理のいずれかでエラーがあったとき処理できないので、成功した結果と失敗した結果をそれぞれ処理したい場合は Promise.allSettled を使います。

async function main() {
  // 非同期処理を5個作成
  const procs = Array
    .from({ length: 5 })
    .map((_, i) => new Promise<number>((resolve, reject) => {
      const seq = i + 1;
      if (seq % 2 === 1) {
        // 奇数個番目の処理なら、何番目か返す
        resolve(seq);
      }
      else {
        // 偶数個番目の処理なら、エラーを返す
        reject(new Error(`${seq} is even`));
      }
    }));

  const results = await Promise.allSettled(procs);
  console.log('成功',
    results
      .filter((result) => result.status === 'fulfilled')
      .map((result) => (result as PromiseFulfilledResult<number>).value)
  );
  console.log('失敗',
    results
      .filter((result) => result.status === 'rejected')
      .map((result) => (result as PromiseRejectedResult).reason.toString())
  );
}
main();

非同期処理の結果が results に配列で渡されます。
stauts が ‘fulfilled’ なら成功で value に返された値が入り、 ‘rejected’ なら失敗で reason が存在しますので、コンソール出力は

成功 [ 1, 3, 5 ]
失敗 [ 'Error: 2 is even', 'Error: 4 is even' ]
プロを目指す人のためのTypeScript入門 (Amazon)

コメント