2015-01-27 3 views
6

FBP와 NoFlo가 프로세스 관점에서 어떻게 작동하는지에 대해 많은 것을 배우고 있습니다. 그래서 내가 일을 함께 해킹 할 수는 있지만 문제를 다른 곳으로 가져 오는지 확신 할 수 없습니다.패킷을 전송하기 전에 모든 포트에서 입력을 대기하는 데 사용해야하는 접근법은 무엇입니까?

이 경우 출력 포트로 데이터를 보내기 전에 2 개의 포트 각각에서 입력을 기다리는 구성 요소를 만듭니다. 왜? 출력 패킷 (그룹 이름과 입력 패킷)을 구성하기 위해 두 입력의 데이터가 필요합니다.

나는 2 가지 접근법을 사용하여 이것을 달성 할 수 있었고 어떤 접근법이 더 나은지 또는 적어도 각 접근법의 위/아래를 알고 싶습니다.

내가 여기에 대해서 이야기하고 구성 요소가 vizicities/그룹이다 :

enter image description here

접근 방법 1 : 입력 2는 패킷

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 
}; 

을 받았다 입력 1에서 패킷을 큐 내부까지 접근법 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; 
}; 

두 접근법이 모두 작동하는 것처럼 보이지만 분명히 다른 접근법을 사용해야합니다. 누군가 나를 위해 이것을 분명히 할 수 있습니까?

답변

3

WirePattern은 현대 NoFlo에서 권장되는 방법입니다. 필요한 경우 패킷 동기화에 대한 추가 제어 기능을 제공합니다. 필요한 모든 입력이 데이터를 얻거나 엄격한 그룹 (또는 심지어 패킷 페이로드) 일치를 요구할 수있는 경우 실행할 수 있습니다.

많은 일반적인 NoFlo 구성 요소가 여전히 WirePatternization을 기다리고 있지만 새로운 것이 든 무엇보다 비동기적인 경우에는 권장되는 방법입니다.

+0

감사합니다. 앙리, 물건을 깨끗이합니다! WirePattern 버전도 훨씬 깔끔해서 나는 그 접근법을 선호했다. 현재 포트 및 매개 변수의 차이점을 이해하고 있지만 적어도 모든 기능을 갖추고 있습니다. –

+0

매개 변수 포트는 구성 요소를 구성하는 데 사용됩니다. 그것들을'required'로 설정하면 WirePattern이 실행되기 전에 한 번 제공되어야하지만, 그 후에 값은'c.params '에 유지됩니다. '. 선택적 매개 변수 포트는 WirePattern 실행을 차단하지 않으므로 그래프 작성 방법에 따라 값이 달라 지거나 없을 수 있습니다. – bergie