複数の非同期処理を並列で実行して、全て終わったらその結果を処理する場合の書き方になります。
【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' ]
コメント