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

Botpress超时流JavaScript代码失效,求助实现1分钟定时检测逻辑

如何实现带每秒变量检查的1分钟计时器?

我需要设置一个1分钟的计时器,计时过程中每秒检查workflow.stillThere变量,若该变量不为空则终止代码执行。我写了一段代码,但无法正常运行,恳请指导正确方向:

const timerDuration = luxon.Duration.fromObject({ minutes: 1 });
const endTime = luxon.DateTime.local().plus(timerDuration);

const checkStillThere = async () => {
  while (luxon.DateTime.local() < endTime) {
    if (workflow.stillThere) {
      break;
    }
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
};

await checkStillThere();

问题分析与修正方案

你的代码逻辑框架没问题,但可能存在几个导致异常的细节,以下是针对性的优化和修正:

1. 变量检测与终止逻辑的明确性

原代码用break跳出循环,但如果需要真正终止后续代码执行,仅跳出循环是不够的——后续代码仍会继续运行。另外要确保workflow.stillThere在当前作用域可访问,且其修改操作能被当前异步函数检测到(比如不要在孤立的上下文如Web Worker中直接修改,需通过消息传递同步状态)。

2. 计时精度优化

原代码每次固定等待1秒,会因为循环内的代码执行产生累计误差。改用计算剩余等待时间的方式,能让计时更精准。

修正后的代码

const timerDuration = luxon.Duration.fromObject({ minutes: 1 });
const endTime = luxon.DateTime.local().plus(timerDuration);

const checkStillThere = async () => {
  while (true) {
    // 优先检查终止条件
    if (workflow.stillThere) {
      // 抛出错误终止整个流程,或用return仅结束当前函数
      throw new Error("检测到stillThere变量,终止执行");
    }

    const now = luxon.DateTime.local();
    // 检查是否已到计时终点
    if (now >= endTime) {
      break;
    }

    // 计算剩余等待时长,避免累计误差
    const remainingMs = endTime.diff(now).milliseconds;
    // 最多等待1秒,保证每秒至少检查一次变量
    await new Promise(resolve => setTimeout(resolve, Math.min(remainingMs, 1000)));
  }
};

// 用try/catch捕获终止信号,处理后续逻辑
try {
  await checkStillThere();
  console.log("计时器正常结束");
} catch (err) {
  console.log(err.message);
  // 这里可以添加终止后的清理或跳转逻辑
}

额外提示

  • 如果是在Node.js环境中,不要轻易用process.exit()强制终止进程,优先通过错误抛出或状态标记控制流程
  • 若workflow.stillThere是由外部异步操作修改的,确保修改操作是在JS事件循环队列中执行的,避免出现变量更新无法被检测到的情况

内容的提问来源于stack exchange,提问作者FreddyTheRuler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:57:39