JSのforEach内部でawaitが使えない

published_at: 2021-07-10

概要

  • JS forEach内部でawaitが使えなかった際に対処した備忘録

詳細

  • LambdaからSQSにメッセージ送信する際に、sendMessage関数をforEach内部で実行していた。
    • いざLambdaを動かすと、SQSにメッセージが送信されていなくて困った

対処法

理由

  • Mozillaに書いてあるが、forEach does not wait for promises.
  • qiitaの記事でforEachのpolyfillを解説を見た。forEachはasyncではないのか。
  • そのため、promiseの処理結果を待たずにイテレートする。
  • Mozillaに載っているforEachでawaitが使えないコード例
1let ratings = [5, 4, 5]; 2let sum = 0; 3let sumFunction = async function (a, b) { 4 return a + b; 5}; 6 7ratings.forEach(async function (rating) { 8 sum = await sumFunction(sum, rating); 9}); 10 11console.log(sum); 12// Naively expected output: 14 13// Actual output: 0