Javascript 木偶演员正在让我的点头过程退出吗?

Javascript 木偶演员正在让我的点头过程退出吗?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我和木偶演员一起玩,写了这个例子(可能永远不会在制作中出现,但仍然如此): const puppeter=require('puppeter'); (异步()=>{ //创建浏览器实例并关闭它 const browser=wait puppeter.launch({headless:false}) browser.disconnect() 等待浏览器关闭() console.log('first check')//这里一切正常,消息已打印 //在关闭的浏览器实例上打开页面。仅用于测试目的 con

我和木偶演员一起玩,写了这个例子(可能永远不会在制作中出现,但仍然如此):

const puppeter=require('puppeter');
(异步()=>{
//创建浏览器实例并关闭它
const browser=wait puppeter.launch({headless:false})
browser.disconnect()
等待浏览器关闭()
console.log('first check')//这里一切正常,消息已打印
//在关闭的浏览器实例上打开页面。仅用于测试目的
const page=wait browser.newPage()
等待页面。转到('http://google.com')
//从未印刷
console.log('第二次检查')
})()
因此,基本上,我正在尝试在浏览器的关闭实例上创建一个新页面。显然,没有打开任何页面,因为浏览器实例已关闭。但我期待着一些错误。相反,什么也不会发生,第二个控制台log永远不会执行

问题。如果没有抛出错误,为什么程序永远不会到达第二个
控制台.log
?木偶演员是否以某种方式关闭了我的NodeJS应用程序的进程?或者我错过了什么

木偶演员版本:最新版本-5.3.1(也叫3.0.0)

顺便说一句,如果我使用一些早期的木偶演员版本(2.0.0),同样的代码会出现错误,正如我所预期的:

Error: WebSocket is not open: readyState 2 (CLOSING)

更新

在调试了一下Puppeter的内部结构后,我发现了以下几点:

它们有一个
连接
类,回调映射作为属性。无论何时调用
newPage
方法,都会创建一个具有新id的连接以及一个新的相应
Promise
。此承诺
解析
拒绝
功能分配给
回调
映射:

send(方法,…参数){
const params=paramArgs.length?paramArgs[0]:未定义;
const id=this.\u rawSend({method,params});
返回新承诺((解决、拒绝)=>{
这个.u callbacks.set(id,{resolve,reject,error:newerror(),method});
});
}
然后,
连接
类具有
onMessage(message)
回调。每当收到一些数据(消息)时,他们都会检查消息,以确定它是
正常
还是
错误
消息。在此之后,它们调用存储的
resolve
reject
回调

但由于浏览器实例已关闭,因此消息永远不会到达,
承诺既没有得到解决,也没有被拒绝

经过小规模的研究,我发现NodeJS无法跟踪这样一个
承诺
。例如:

(异步()=>{
持续承诺=新承诺((解决、拒绝)=>{
如果(真===假){
resolve(13)//这永远不会发生
}
})
常量值=等待承诺
console.log(value)//我们从未来过这里
})()

您没有看到任何错误,这可能是因为您没有等待
async
函数解决。如果附加
catch
处理程序,则很可能会捕获错误:

const puppeter=require('puppeter');
(异步()=>{
//创建浏览器实例并关闭它
const browser=wait puppeter.launch({headless:false})
browser.disconnect()
等待浏览器关闭()
console.log('first check')//这里一切正常,消息已打印
//在关闭的浏览器实例上打开页面。仅用于测试目的
const page=wait browser.newPage()
等待页面。转到('http://google.com')
//从未印刷
console.log('第二次检查')
})()
.然后(()=>console.log('done'))
.catch(e=>console.error(e));//{
试一试{
//创建浏览器实例并关闭它
const browser=wait puppeter.launch({headless:false});
browser.disconnect();
等待浏览器关闭();
console.log(“第一次检查”);//这里一切正常,消息已打印
//在关闭的浏览器实例上打开页面。仅用于测试目的
const page=wait browser.newPage();
等待页面。转到(“http://google.com");
//从未印刷
控制台日志(“第二次检查”);
}捕获(e){
控制台错误(e);
}
})();

您没有看到任何错误,这可能是因为您没有等待
async
函数解决。如果附加
catch
处理程序,则很可能会捕获错误:

const puppeter=require('puppeter');
(异步()=>{
//创建浏览器实例并关闭它
const browser=wait puppeter.launch({headless:false})
browser.disconnect()
等待浏览器关闭()
console.log('first check')//这里一切正常,消息已打印
//在关闭的浏览器实例上打开页面。仅用于测试目的
const page=wait browser.newPage()
等待页面。转到('http://google.com')
//从未印刷
console.log('第二次检查')
})()
.然后(()=>console.log('done'))
.catch(e=>console.error(e));//{
试一试{
//创建浏览器实例并关闭它
const browser=wait puppeter.launch({headless:false});
browser.disconnect();
等待浏览器关闭();
console.log(“第一次检查”);//这里一切正常,消息已打印
//在关闭的浏览器实例上打开页面。仅用于测试目的
const page=wait browser.newPage();
等待页面。转到(“http://google.com");
//从未印刷
控制台日志(“第二次检查”);
}捕获(e){
控制台错误(e);
}
})();

在我的示例中,使用了匿名自调用函数。在第一个示例中,您尝试将
async/await
API与
Promise
API混合使用,这是不必要的,应该避免使用。您的第二个示例更有意义,但是,如果您运行两个建议的解决方案,您将看到“第二次检查”从未打印,因为
newPage
promise从未解决,也没有被拒绝,NodeJS无法等待此类承诺和退出