You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:45:03