私はまだ、FBP と NoFlo がプロセスの観点からどのように機能するかについて多くのことを学んでいるので、仕事をする何かを一緒にハックすることはできますが、別の場所に問題を持ち込んでいるかどうかはわかりません.
この場合、データを出力ポートに送信する前に、2 つのポートのそれぞれで入力を待機するコンポーネントを作成しています。なんで?出力パケット (グループ名と入力パケット) を作成するには、両方の入力からのデータが必要です。
私は2つのアプローチを使用してこれを達成することができました。どちらのアプローチが優れているか、少なくとも各アプローチの長所/短所を知りたいです。
ここで話しているコンポーネントは vizicities/Group です。
アプローチ 1: input2 がパケットを受信するまで、input1 からのパケットを内部的にキューイングする
var noflo = require("noflo");
exports.getComponent = function() {
var AddGroup = new noflo.Component();
AddGroup.description = "This component adds a group to the data packets";
var packets = [];
var groupName = "";
// Register ports and event handlers
AddGroup.inPorts.add("in", { datatype: "all" }, function(event, payload) {
switch (event) {
case "begingroup":
AddGroup.outPorts.out.beginGroup(payload);
break;
case "endgroup":
AddGroup.outPorts.out.endGroup();
break;
case "data":
// Queue packet
packets.push(payload);
break;
case "disconnect":
// Only send output if group has been set
if (groupName) {
for (var i = 0; i < packets.length; i++) {
AddGroup.outPorts.out.beginGroup(groupName);
AddGroup.outPorts.out.send(packets);
AddGroup.outPorts.out.endGroup();
}
// Disconnect output port when input port disconnects
AddGroup.outPorts.out.disconnect();
}
break;
}
});
AddGroup.inPorts.add("group", { datatype: "string" }, function(event, payload) {
switch (event) {
case "begingroup":
break;
case "endgroup":
break;
case "data":
groupName = payload;
break;
case "disconnect":
// TODO: Does this dupe anything with the same logic on the in port?
// Only send output if group has been set
if (groupName) {
for (var i = 0; i < packets.length; i++) {
AddGroup.outPorts.out.beginGroup(groupName);
AddGroup.outPorts.out.send(packets);
AddGroup.outPorts.out.endGroup();
}
// Disconnect output port when input port disconnects
AddGroup.outPorts.out.disconnect();
}
break;
}
});
AddGroup.outPorts.add("out", { datatype: "all" });
return AddGroup; // Return new instance
};
アプローチ 2: WirePattern ヘルパーを使用する
var noflo = require("noflo");
exports.getComponent = function() {
var AddGroup = new noflo.Component();
AddGroup.description = "This component adds a group to the data packets";
var config = {
in: ["in", "group"],
out: "out"
};
AddGroup.inPorts = new noflo.InPorts({
in: {
datatype: "string",
required: true
},
group: {
datatype: "string",
required: true
}
});
AddGroup.outPorts = new noflo.OutPorts({
out: {
datatype: "all"
}
});
noflo.helpers.WirePattern(AddGroup, config, function(data, groups, outPort) {
outPort.beginGroup(data.group);
outPort.send(data.in);
outPort.endGroup();
});
// Return new instance
return AddGroup;
};
どちらのアプローチも機能しているように見えますが、どちらか一方を使用する理由があることは明らかです。誰かが私のためにこれを明確にすることができますか?