ループの中で 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