Array.map()の中で非同期処理を行う
code:js
async function test() {
const ret = await Promise.all(array1.map(async (item) => {
// 非同期処理
return await item * 10;
}));
console.log(1,ret);
return ret;
}
async function getAsync() {
// await console.log('a');
const hoge = await test();
console.log(2,hoge);
}
getAsync();
出力
code:js
Promise.all()がない場合
code:js
test()のawaitがない場合
code:js
getAsync()のawaitがない場合
code:js
Promise.all()とは
Promise.all()は、Promiseの配列を引数に取る。
全てのPromiseが成功した場合は、then(val)で受けて、引数(val)は結果の配列となる。
1つでも失敗した場合は、catch(err)で受けて、引数(err)は最初の失敗のreject(err)の値が入る。
流れ
1. array.map()は各要素に対して非同期処理を実行し、その実行結果をPromise型として返す
2. array.map()はPromise型の配列となる。
3. Promise.all()で2のPromise型の配列を受ける。
4. 全ての処理が成功した場合は、awaitがPromiseの配列を、結果の配列へと展開する。
tamuraryoya.icon Promise.allでArray.mapを非同期化するのすごい参考になる!
tj.icon 怖い、Array.map に非同期codeを実装するPRには、自分はレビュー時、🆖ですね。😂
tabata.icon なぜNGかの理由を教えてください!
tj.icon 意味ないから、自分なら「もっとシンプルやり方で実現して」のコメントを書きます。
tamuraryoya.icon たまに、データの更新のAPIを並行して複数呼ぶときとかにこういう実装使いますね
code:ts
const updateMember = (member): Promise<any> => fetch('/member', { payload: member, method: 'post' });
await Promise.all(members.map((member) => updateMember(member));
await Promise.allSettled(members.map((member) => updateMember(member));
tj.icon この場合、API チームを相談して、patch /members APIを提供してください。
tamuraryoya.icon それに越したことはないですよね〜
onuma.icon updateMemberがPromiseを返しているのは、ぱっと見気づきにくいですね。。。まぁそもそもAPIリクエストを並列で走らせる行為自体があんまりよくないので、一括で更新できないかとか、API実装がわを検討した方がいいケースが多そうですね🤔
👍 tamuraryoya tamuraryoya.icon がいいねしました on 2020/4/9