如何以不一次发送所有消息的方式自定义 Node-Red 中的拆分节点?

How to customize the Split node in Node-Red in a way not to send all msgs at once?

我正在尝试自定义 Node-Red 中的 Split 节点,使其仅在第一条消息到达 Join 节点时才发送下一条消息;因为我在两者之间进行一些处理,并且想在加入它们之前分别处理每个消息。

所以我从 Node-Red 项目中克隆了 Split 节点,在数组拆分发生的部分;我注册事件的监听器(由原始 Split 节点生成的随机 ID)。

else if (Array.isArray(msg.payload)) { // then split array into messages
     msg.parts.type = 'array';
     var count = msg.payload.length / node.arraySplt;
     if (Math.floor(count) !== count) {
         count = Math.ceil(count);
     }
     msg.parts.count = count;
     var pos = 0;
     var data = msg.payload;
     msg.parts.len = node.arraySplt;
     for (let i = 0; i < count; i++) {
         msg.payload = data.slice(pos, pos + node.arraySplt);
         if (node.arraySplt === 1) {
             msg.payload = msg.payload[0];
         }
         msg.parts.index = i;
         pos += node.arraySplt;
         if (i === 0) {
             send(RED.util.cloneMessage(msg));
             continue;
         }
         let eventName = msg.parts.id + '-' + i;
         addHandler(eventName, send, msg);
     }
     done();
} 

我的处理函数

function addHandler(eventName, send, msg) {
  RED.events.addListener(eventName, () => {
    send(RED.util.cloneMessage(msg));
  });
}

并且在 Join 节点(在同一个 js 文件中)

// commented below is the original code of the join function
// if ((tcnt > 0 && group.currentCount > tcnt) || msg.hasOwnProperty('complete')) {
//     completeSend(partId);
//     return;
// } else
if (msg.parts.index <= (msg.parts.count - 2)) {
    let eventName = msg.parts.id + '-' + (parseInt(msg.parts.index) + 1);
    RED.events.emit(eventName);
} else if (msg.parts.index >= (msg.parts.count - 1)) {
    completeSend(partId);
    return;
}

然而,这将发送第一条消息(因为我直接发送它,而不是通过事件),并且只发送最后一条消息;它会跳过中间的任何内容。

修改拆分节点是错误的做法。

有速率限制节点可以为您执行此操作。例如https://flows.nodered.org/node/node-red-contrib-semaphore

或者你可以使用具有释放功能的延迟节点