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

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

相关产品推荐
方舟 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