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

