以下代码将在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
节点.js版本:10.14.2
操作系统:Windows 10 1803<</p>
这似乎值得报告给傀儡师GitHub存储库的问题。在这种组合之后,stdin和事件循环发生了一些非常奇怪的事情(Chrome确实退出了,但Node.js仍然存在,并且在Ctrl + C中止后,提示在Windows shell中出现两次,就好像ENTER被缓冲到退出一样)。
FWIW,如果readline.createInterface()
选项设置为 false
terminal
,则此问题将消失。
似乎你并不完全理解 ASYNC/AWAIT 在 js 中是如何工作的。
如果您在异步函数中使用 await,它将暂停异步函数并等待 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)
}