Node.js环境下JavaScript如何等待对象属性变为true后继续执行代码
实现方案
我们可以利用Promise的单次决议特性来实现等待逻辑,核心调整步骤如下:
第一步:改造finished Promise定义,暴露resolve方法
你原代码中初始化的shared.finished没有保存resolve引用,永远无法触发决议,需要调整为:
// 声明外部变量存储Promise的resolve方法 let resolveFinished; let shared = { url: "", device: "", // 初始化Promise时把resolve方法存到外部变量 finished: new Promise(resolve => { resolveFinished = resolve; }) };
第二步:收到finished事件时触发Promise决议
修改onMessageReceivedEvent回调逻辑,收到完成信号时调用刚才保存的resolve方法:
await page.exposeFunction( "onMessageReceivedEvent", async (e: { type: string; data: Message }) => { if (e.data === "finished") { // 触发Promise决议,后续等待的代码会继续执行 resolveFinished(true); } } );
第三步:在需要等待的位置await该Promise
直接在你标记的等待位置添加await语句即可:
console.log('before'); // 等待finished事件触发、Promise决议后才会往下执行 await shared.finished; console.log('after')
可选优化:添加超时避免无限等待
如果担心页面始终不触发finished事件导致程序卡住,可以额外封装超时逻辑:
// 封装带超时的等待方法,默认超时时间30秒 function waitWithTimeout(promise, timeout = 30000) { return Promise.race([ promise, new Promise((_, reject) => { setTimeout(() => reject(new Error('等待finished事件超时')), timeout) }) ]) } // 使用时替换原有await逻辑即可 await waitWithTimeout(shared.finished, 60000);
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

