Это работало хорошо для одного вызова асинхронно:
"use strict";
function bashRun(commandList,stdoutCallback,completedCallback)
{
const proc=require("child_process");
const p=proc.spawn("bash");
p.stdout.on("data",function(data){
stdoutCallback(output);
});
p.on("exit",function(){
completedCallback();
});
p.stderr.on("data",function(err){
process.stderr.write("Error: "+err.toString("utf8"));
});
commandList.forEach(i=>{
p.stdin.write(i+"\n");
});
p.stdin.end();
}
module.exports.bashRun = bashRun;
Но внутри цикла for это не так. Он выводит только информацию о выходе самого последнего элемента (процесса):
for(var i=0;i<20;i++)
{
var iLocal =i;
bashRun(myList,function(myStdout){ /* only result for iLocal=19 !*/},function(){});
}
Мне нужно это асинхронно (а также одновременно с несколькими дочерними процессами) выдавать выходные данные от каждой stdoutCallback
функций, чтобы выполнить некоторую обработку в ней. Хотя стандартный вывод не работает, completedCallback
вызывается как минимум 20 раз, поэтому в течение некоторого временного интервала должно быть еще 20 процессов, но не уверен, что они существовали в один и тот же промежуток времени.
Что я делаю не так, чтобы порожденные дочерние процессы не могли передать свой вывод nodejs? (почему только последний из них (я = 19) может?)
Я пытался обменять спавна на fork
, но теперь выдает ошибку
p.stdout.on("data",function(data){
^
TypeError: Cannot read property 'on' of null
Как я могу использовать что-то еще, чтобы сохранить те же функции, что и у вышеуказанного модуля?