Процесс заблокирован в console.log при объединении readline и puppeteer - PullRequest
0 голосов
/ 21 января 2019

Следующий код будет заблокирован навсегда до console.log("this line.....");.

const puppeteer = require('puppeteer');
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
async function main() {
    browser = await puppeteer.launch();
    rl.close();
    await browser.close();  
    console.log("this line will not be executed.");
}
main();

Перемещение rl.close() ниже console.log решает эту проблему, удаляя browser = ..... и await browser.close() тоже самое.

Это ошибка кукловода? Или есть какой-то механизм, который я не понимаю?

Версия кукловода: 1.11.0
Версия Node.js: 10.14.2
ОС: Windows 10 1803

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Кажется, об этом стоит сообщить как о проблеме в репозиторий GitHub кукловода.Что-то действительно странное происходит с stdin и циклом обработки событий после этой комбинации (Chrome завершает работу, но Node.js остается, и после сброса Ctrl + C приглашение дважды появляется в оболочке Windows, как если бы ENTER был буферизован до выхода).

FWIW, эта проблема исчезает, если для параметра terminal для readline.createInterface() установлено значение false.

0 голосов
/ 21 января 2019

Похоже, вы не до конца понимаете, как работает ASYNC / AWAIT в js.

Если вы используете await внутри функции async , это приостановит асинхронностьи дождитесь разрешения Promise, прежде чем двигаться дальше.

Код внутри вашей асинхронной функции будет обрабатываться последовательно, как если бы она была синхронной, но без блокировки основного потока.

async function main() {
    browser = await puppeteer.launch(); // will be executed first
    rl.close();// will be executed second (wait untill everithing above is finished)
    await browser.close(); // will be executed third (wait untill everithing above is finished)
    console.log("this line will not be executed."); // will be executed forth (wait untill everithing above is finished)
}
...