Node.js 在序列化循环中运行示例代码时出错

Node.js 在序列化循环中运行示例代码时出错,node.js,Node.js,我对node进行了一些修补,在尝试学习child_进程模块时,遇到了一个问题。我试图序列化许多对“ps-eF | grepsh”的调用,但它在我的系统上崩溃,错误如下。所以有两个问题。首先,在没有图书馆的情况下,有没有更好的方法来做我正在尝试的事情?第二,为什么它不起作用:) events.js:71 抛出参数[1];//未处理的“错误”事件 ^ 错误:此套接字已关闭。 在套接字处写入(net.js:519:19) at Socket.write(net.js:511:15) 在插座上。(/ho

我对node进行了一些修补,在尝试学习child_进程模块时,遇到了一个问题。我试图序列化许多对“ps-eF | grepsh”的调用,但它在我的系统上崩溃,错误如下。所以有两个问题。首先,在没有图书馆的情况下,有没有更好的方法来做我正在尝试的事情?第二,为什么它不起作用:)

events.js:71
抛出参数[1];//未处理的“错误”事件
^
错误:此套接字已关闭。
在套接字处写入(net.js:519:19)
at Socket.write(net.js:511:15)
在插座上。(/home/me/tmp/test.js:10:16)
位于Socket.EventEmitter.emit(events.js:96:17)
at Pipe.onread(net.js:397:14)
函数callpsgrep(回调){
var spawn=require('child_process')。spawn,
ps=spawn('ls',['-la']),
grep=spawn('grep',['bananas']);
ps.stdout.on('data',函数(data){
grep.stdin.write(数据);
});
ps.stderr.on('data',函数(data){
log('ps stderr:'+数据);
});
ps.on(退出),功能(代码){
如果(代码!==0){
console.log('ps进程以代码'+代码退出);
}
grep.stdin.end();
});
grep.stdout.on('data',函数(data){
控制台日志(“”+数据);
});
grep.stderr.on('data',函数(data){
log('grep stderr:'+数据);
});
grep.on('exit',函数(代码){
如果(代码!==0){
console.log('grep进程退出,代码为'+code');
}
回调();
});
}
函数系列(一){
如果(i<1000){
callpsgrep(函数(){
返回序列(i+1);
});
}
}
系列(0);

关闭事件上关闭grep的stdin,而不是退出事件

ps.on('exit', function (code) {
  if (code !== 0) {
    console.log('ps process exited with code ' + code);
  }
});

ps.on('close', function (code) {
  grep.stdin.end();
});

虽然不是很好,但我在帮助文件中阅读了以下内容

事件:“退出” 请注意,子进程stdio streams可能仍处于打开状态

事件:“关闭”#
当子进程的stdio流全部终止时,将发出此事件。这与“退出”不同,因为多个进程可能共享同一个stdio流。

好的,这似乎可以让事情顺利进行,但我不明白为什么。你能解释一下吗?太好了。谢谢你的解释。值得注意的是,文档中的spawn示例错误地显示了这一点:)
function callpsgrep(callback) {
  var spawn = require('child_process').spawn,
      ps    = spawn('ls', ['-la']),
      grep  = spawn('grep', ['bananas']);

  ps.stdout.on('data', function (data) {
    grep.stdin.write(data);
  });

  ps.stderr.on('data', function (data) {
    console.log('ps stderr: ' + data);
  });

  ps.on('exit', function (code) {
    if (code !== 0) {
      console.log('ps process exited with code ' + code);
    }
    grep.stdin.end();
  });

  grep.stdout.on('data', function (data) {
    console.log('' + data);
  });

  grep.stderr.on('data', function (data) {
    console.log('grep stderr: ' + data);
  });

  grep.on('exit', function (code) {
    if (code !== 0) {
      console.log('grep process exited with code ' + code);
    }
    callback();
  });
}

function series(i) {
  if (i < 1000) {
    callpsgrep( function() {
      return series(i+1);
    });
  }
}
series(0);
ps.on('exit', function (code) {
  if (code !== 0) {
    console.log('ps process exited with code ' + code);
  }
});

ps.on('close', function (code) {
  grep.stdin.end();
});