#javascript #node.js #puppeteer
#javascript #node.js #кукловод
Вопрос:
Я понимаю, что в await Promise.all(...)
коде должно выполняться следующим образом:
- выведите первый console.log
- подождите 9 секунд
- распечатать последний 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
блока 🙂