Обход нескольких URL-адресов в цикле с помощью puppeteer

Я

urls = ['url','url','url'...]

это то, что я делаю

urls.map(async (url)=>{
  await page.goto(`${url}`);
  await page.waitForNavigation({ waitUntil: 'networkidle' });
})

это, похоже, не ждет загрузки страницы и довольно быстро посещает все URL-адреса(я даже пытался использовать страницу.инструкция waitfor )

просто хотел знать, делаю ли я что-то принципиально неправильно или этот тип функциональности не рекомендуется/поддерживается

1 ответов


map, forEach, reduce и т. д. не ждет асинхронной операции внутри них, прежде чем они перейдут к следующему элементу итератора, над которым они повторяют.

существует несколько способов синхронного прохождения каждого элемента итератора при выполнении асинхронной операции, но самым простым в этом случае, я думаю, было бы просто использовать обычный for оператор, который ждет завершения операции.

const urls = [...]

for (let i = 0; i < urls.length; i++) {
    const url = urls[i];
    await page.goto(`${url}`);
    await page.waitForNavigation({ waitUntil: 'networkidle' });
}

Это посетите один адрес за другим, как вы ожидаете. Если вам интересно повторять последовательно с помощью await/async, вы можете взглянуть на этот ответ:https://stackoverflow.com/a/24586168/791691