Обычно компоненты NoFlo ничего не делают до тех пор, пока не получат какой-либо ввод, в данном случае путь к файлу для чтения. Из документов по компонентам NoFlo:
Работающий экземпляр компонента в сети NoFlo называется процессом. Прежде чем процесс получит данные, он должен быть инертным, просто слушая свои входные порты. Процессы, которые должны начать что-то делать при запуске сети, должны быть инициированы для этого путем отправки им начального информационного пакета.
Последняя строка в вашем определении графа .fbp отправляет строку package.json
компоненту ReadFile.
Вы также можете сделать это программно после загрузки файла в сеть NoFlo:
noflo.loadFile(filepath, process.cwd(), function (network) {
// Now we have access to the NoFlo network instance
// Add Initial Information Packet programatically
network.graph.addInitial(someFileToRead, 'Read', 'in');
// Tell NoFlo to send the new IIPs
network.sendInitials();
});
Экспортированные порты и подграфы
Теперь есть и более элегантный способ сделать это, представив файл .fbp
в виде графика в ComponentLoader NoFlo, а затем взаимодействуя с ним так же, как с любым другим компонентом.
Чтобы сделать интересующие вас порты доступными извне, их необходимо экспортировать. В данном случае как минимум порт ReadFile IN из графа. Это изменит определение вашей сети на:
# Export the filename port so it can be accessed from outside
INPORT=Read.IN:FILENAME
# The rest of the graph definition follows
Read(filesystem/ReadFile) OUT -> IN Display(core/Output)
(так случилось, что это именно тот пример, который я использовал для экспортируемых портов в определении языка .fbp< /а>)
Чтобы сделать ваш график доступным как компонент, вам нужно сохранить его внутри вашего проекта Node.js (условно это подкаталог graphs/
) и зарегистрировать его в файле package.json
:
{
"noflo": {
"graphs": {
"MyGraph": "graphs/MyGraph.fbp"
}
}
}
Теперь вы можете обращаться с ним как с любым другим компонентом. Например:
var loader = new noflo.ComponentLoader(__dirname);
loader.load('MyGraph', function (instance) {
// The instance is a running NoFlo subgraph with your graph definition
// Create a socket and attach it to the exported port
var filename = noflo.internalSocket.createSocket();
instance.inPorts.filename.attach(filename);
filename.send(someFileToRead);
filename.disconnect();
});
Одна из причин, по которой этот метод является предпочтительным, заключается в том, что его можно использовать не только для отправки IIP, но и для подключения сокетов к экспортируемым выходным портам и прослушивания событий на них. Таким образом, вы можете легко использовать любые графики NoFlo в качестве асинхронных функций в своем приложении JavaScript.
person
bergie
schedule
10.06.2014