次のような、配列の各要素に対して、何かの関数(syncFunc)を呼び出す処理をしているコードをPromise版のasyncFuncを使う形に置き換える時用のメモ
["foo", "bar", "baz"].forEach((e)=>{
syncFunc(e);
});
以下のコードは全てasync function内にあるものと思ってください。
配列内の各要素に対する処理を並列に行なっても問題無い場合
await Promise.all(["foo", "bar", "baz"].map((e)=>{
return asyncFunc(e);
}));
for ofを使うとこういう書き方もできます。
const tmp=[];
for(const e of ["foo", "bar", "baz"]){
tmp.push(asyncConsoleLog(e));
}
await Promise.all(tmp);
promiseを格納する配列を別に用意する必要があるのがちょっと美しくないですが、関数に渡すデータが複数の配列に入っている時なんかは、このままforループを増やしていって、最後に一回Promise.allすれば良いので便利そうですね。
順次実行する(前の要素の処理が終わってから次の処理を行う)必要がある場合
await ["foo", "bar", "baz"].reduce((p,e)=>{
return p.then(()=>{
return asyncFunc(e);
})
},Promise.resolve())
こちらも、for ofを使うと次のように書き換えられる。
for(const e of ["foo", "bar", "baz"]){
await asyncConsoleLog(data);
}
こっちは圧倒的にfor ofの方が便利そうです。というか、そもそものreduce関数の使い方が分かり難いだけとも言えるかもしれませんが。
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。
2019/3/27 reduce関数と書くべきところをmap関数と書いていたので訂正しました。