Estoy tratando de personalizar el nodo Split en Node-Red de manera que envíe el siguiente mensaje solo cuando el primero llegue al nodo Join; ya que estoy haciendo un procesamiento intermedio y me gustaría procesar cada mensaje por separado antes de unirme a ellos.
Entonces, he clonado el nodo Split del proyecto Node-Red, y en la parte donde ocurre la división de una matriz; Registro oyentes de eventos (ID aleatorios generados por el nodo Split original).
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(); }Mi función de controlador
function addHandler(eventName, send, msg) { RED.events.addListener(eventName, () => { send(RED.util.cloneMessage(msg)); }); }Y en el nodo Join (que está en el mismo archivo 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; }Sin embargo, esto enviaría el primer mensaje (como lo envío directamente, y no a través de un evento), y solo el último mensaje; saltaría lo que sea en el medio.
Modificar el nodo dividido es la forma incorrecta de hacerlo.
Hay nodos de limitación de velocidad que harán esto por usted. por ejemplo , https://flows.nodered.org/node/node-red-contrib-semaphore
O puede usar el nodo de retraso con su función de liberación