以下代码将在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
答案 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)
}