合并readline和puppeteer时,进程在console.log处被阻止

时间:2019-01-21 07:26:08

标签: node.js readline puppeteer

以下代码将在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()也是一样。

这是p的错误吗?还是有一些我不了解的机制?

木偶版本:1.11.0
Node.js版本:10.14.2
操作系统:Windows 10 1803

2 个答案:

答案 0 :(得分:1)

似乎值得将这个问题报告给puppeteer GitHub存储库。在此组合之后,stdin和事件循环确实发生了一些奇怪的事情(Chrome确实退出了,但是Node.js仍然存在,并且在Ctrl + C中止之后,提示符在Windows Shell中出现两次,就像ENTER被缓冲直到退出一样)。 / p>

FWIW,如果将terminal的{​​{1}}选项设置为readline.createInterface(),此问题将消失。

答案 1 :(得分:0)

您似乎并不完全了解ASYNC / AWAIT在js中的工作方式。

如果您在 async 函数内使用 await ,它将暂停async函数并等待Promise解决后再继续。

async 函数中的代码将被同步处理,就好像它是同步的一样,但是不会阻塞主线程。

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)
}