多个 bash 脚本不能 运行 在生成的子进程中异步
Multiple bash scripts can't run asynchronously within spawned child processes
这 运行 适合单次异步调用:
"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
函数的输出以在其中进行一些处理。虽然 stdout 不起作用,但 completedCallback
至少被调用了 20 次,因此在某个时间片中仍然必须有 20 个进程,但不确定它们是否存在于同一时间片中。
我做错了什么,派生的子进程无法将它们的输出提供给 nodejs? (为什么只有最后一个(i=19)可以?)
我试图用 fork
交换 spawn 但现在它给出错误
p.stdout.on("data",function(data){
^
TypeError: Cannot read property 'on' of null
如何使用其他东西来保留上述模块的相同功能?
范围值 i
似乎有问题,请尝试将循环更改为使用 let
。
例如:for(let i=0;i<20;i++)
这 运行 适合单次异步调用:
"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
函数的输出以在其中进行一些处理。虽然 stdout 不起作用,但 completedCallback
至少被调用了 20 次,因此在某个时间片中仍然必须有 20 个进程,但不确定它们是否存在于同一时间片中。
我做错了什么,派生的子进程无法将它们的输出提供给 nodejs? (为什么只有最后一个(i=19)可以?)
我试图用 fork
交换 spawn 但现在它给出错误
p.stdout.on("data",function(data){
^
TypeError: Cannot read property 'on' of null
如何使用其他东西来保留上述模块的相同功能?
范围值 i
似乎有问题,请尝试将循环更改为使用 let
。
例如:for(let i=0;i<20;i++)