Почему кукловод не ждет?

#javascript #node.js #puppeteer

#javascript #node.js #кукловод

Вопрос:

Я понимаю, что в await Promise.all(...) коде должно выполняться следующим образом:

  1. выведите первый console.log
  2. подождите 9 секунд
  3. распечатать последний console.log

Как я могу сделать так, чтобы 3-й оператор печати печатался через 9 секунд, а не сразу?

Что на самом деле происходит

Все инструкции внутри await Promise.all(...) выполняются одновременно, а не последовательно.

 (async () => {
  const browser = await puppeteer.launch({headless:false, slowMo:100});
  const page = await browser.newPage();
  await page.goto('https://google.com', {waitUntil: 'networkidle2'});


await Promise.all(

  [
    console.log('printing before waiting 9 sec'),
    page.waitFor(9000),
    console.log('printing after waiting 9 sec')
  ]

);


//await browser.close();
})().catch((error) =>{
  console.error("the message is "   error.message);
});


app.listen(3000, function (){
    console.log('server started');
})
  

Ответ №1:

Нет, функции в Promise.all(…) выполняются одновременно. Цель этого — убедиться, что все они разрешены, прежде чем ваш код продолжит работу. Возвращаемые значения задаются в указанном порядке, но сами функции запускаются все сразу.

Чтобы запускать асинхронные функции по порядку, используйте .then() или await .

Поскольку ваша единственная асинхронная функция page.waitFor ( console.log является синхронной функцией), вы можете просто сделать это:

 console.log('printing before waiting 9 sec')
await page.waitFor(9000)
console.log('printing after waiting 9 sec')
  

Комментарии:

1. Итак, это означает, что мне пришлось бы создавать новые обещания с New Promise помощью конструктора для каждого console.log() и после этого вызывать then их? Было бы очень полезно, если бы вы могли показать мне, как вы могли бы решить проблему для моего конкретного сценария, учитывая, что я уже запускаю этот код в async функции. Большое спасибо

2. @bibscy, просто используй код из моего примера вместо своего await Promise.all блока 🙂