NodeJS与Puppeteer中如何等待对象内属性变为true后继续执行代码
实现方案
你可以通过「提前持有Promise的resolve引用」的方式实现等待逻辑,具体修改如下:
第一步:调整shared对象初始化,预留Promise resolve入口
你需要把Promise的resolve方法提前存到外部变量,方便后续事件触发时调用,将原有shared定义替换为以下代码:
// 声明变量存储Promise的resolve方法 let finishedResolve: (value: boolean) => void; let shared = { url: "", device: "", // 初始化pending状态的Promise,把resolve权限暴露到外部 finished: new Promise<boolean>((resolve) => { finishedResolve = resolve; }) };
第二步:收到finished消息时触发Promise完成
在onMessageReceivedEvent的判断分支中调用预留的resolve方法:
if (e.data === "finished") { finishedResolve(true); }
第三步:在需要等待的位置await该Promise
将你需要等待的位置替换为await语句即可:
console.log('before'); // 等待finished事件触发后才会继续往下执行 await shared.finished; console.log('after')
可选优化:添加超时逻辑避免程序永久卡住
如果需要防止页面始终不触发finished事件导致程序挂死,可以加一个超时竞速逻辑:
console.log('before'); // 30秒超时,超时直接抛出错误 const timeout = new Promise((_, reject) => { setTimeout(() => reject(new Error('等待finished事件超时')), 30 * 1000); }); await Promise.race([shared.finished, timeout]); console.log('after')
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

