タイトル通り、map()
のループ処理内で await
を使用する方法です。
正直、これができなくて別の方法を使ってみたりと結構悩んでいたので、解決できてかなり助かりました…!
参考にさせていただいた記事はこちら。
mapのループ内でawaitしたいのに怒られてはまった件 – Qiita
https://qiita.com/yakipudding/items/4570eb453d0b853e0b26
解決策は 2つありましたが、私は Promise.all
を使う方法を採用しました。
サンプルコードは下記のとおりです。
const promises = memberIds.map(memberId => { return getMemberData(memberId); }); const members = await Promise.all(promises);
ちなみに、getMemberData()
関数は下記のように指定しています。
async getMemberData(memberId) { ....... return {[会員情報]} }
変数 memberIds
に会員ID を配列で持っているので、こちらを map()
メソッドでループし、getMemberData()
関数を呼び出して会員情報を取得する処理を記述します。
なお、ここではまだ getMemberData()
関数からデータを取得していないようです。
で、最後に await Promise.all(promises)
を実行することで、会員ID ごとに順次 getMemberData()
関数を呼び出し、結果を変数 members
に格納していきます。
…正直説明がかなり下手なので、是非上記サイトをご参照ください!
なお、2つ目の方法としては、map()
ではなく for()
を使う方法が挙げられていました。
こちらは特に難しい記述をしなくても良いので、実装は簡単ですね。
…ただ、ちょっとコードがダサくなる&長くなるので、個人的には最終手段にしたいところです。
ですが、Promise.all
での記述が想定通りに動作してくれたので、今回は for()
を使わずに済みました。
以上、JavaScript の map()
メソッド内で await
を使用する方法でした。
正直、参考サイトのコードをコピーしただけで、いまいち内容を理解できていないので…時間を見つけて理解できるようにしたいと思います。
ご参考になれば幸いです。