Несколько сценариев bash не могут выполняться асинхронно в порожденных дочерних процессах - PullRequest
0 голосов
/ 22 января 2019

Это работало хорошо для одного вызова асинхронно:

"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

Как я могу использовать что-то еще, чтобы сохранить те же функции, что и у вышеуказанного модуля?

1 Ответ

0 голосов
/ 22 января 2019

Похоже, проблема со значением области действия i, попробуйте изменить цикл на let.

Например: for(let i=0;i<20;i++)

...