如何在Node-RED中让node.on("close")实现同步串行执行?
解决Node-RED节点close事件异步任务串行执行问题
要让多个相同节点的close事件异步任务串行执行,避免并发导致的顺序混乱,你可以通过全局Promise队列控制任务执行顺序,确保前一个节点的异步任务完成后,再启动下一个节点的任务。
实现步骤:
- 在节点模块文件的全局作用域(所有节点实例共享的区域)定义一个串行队列,初始化为已完成的Promise,保证第一个任务能立即执行:
// 全局串行队列,用于控制close事件的异步任务顺序 let closeTaskQueue = Promise.resolve();
- 修改
node.on("close")的回调逻辑,将当前节点的异步任务加入队列,通过then链式调用实现串行:
node.on("close", async (removed, done) => { if (removed) { // 将当前节点的close任务追加到串行队列 closeTaskQueue = closeTaskQueue.then(async () => { console.log("here1"); try { await utils.deletePlcOption(node); } catch (err) { utils.errorHandler(err, node); } console.log("here2"); }); // 等待当前任务执行完成 await closeTaskQueue; } done(); });
原理说明:
- 全局的
closeTaskQueue会维护一个Promise链式调用序列,每个节点的close任务都会被追加到序列末尾。 - 只有前一个任务的Promise完成后,才会执行下一个任务的逻辑,从而保证两个节点的任务按照
here1 → here2 → here1 → here2的顺序执行。
内容的提问来源于stack exchange,提问作者Jantoma21
相关产品推荐
相关产品推荐

