Back

ループの中で await したいときは for await...of を使う

ループの中で await したいときは for await...of を使う

Playwright を使ってスクレイピングするコードを書いていたときにハマった。

forEach で順次ページ遷移するコードを書こうと思い、以下のようなコードを書いていたが、

const ids = [1, 2, 3]

ids.forEach(async (id) => {
  await page.goto(`https://hoge.com/articles/${id}/`)

  const data = await page.evaluate(() => {
    return {
      title: document.querySelector('.page-title').innerText,
    }
  })
  ...
})

以下のエラーで動かなかった。

node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);

ググったら for await...of なるものがあるようだ。

以下のコードに修正したら動くようになった。

for await (const id of ids) {
  await page.goto(`https://hoge.com/articles/${id}/`)

  const data = await page.evaluate(() => {
    return {
      title: document.querySelector('.page-title').innerText,
    }
  })
  ...
}

実行環境

  • Node.js v20.9.0

参考