child_process在执行命令后,stdout.on("data" 怎么样在遇到指定字符串或者条件时退出?
发布于 11 年前 作者 yakczh 8272 次浏览 最后一次编辑是 8 年前

var iconv = require(‘iconv-lite’); var ls= require(‘child_process’).spawn(‘ping’, [‘www.baidu.com’]);

var MAX=2; var count=1;

ls.stdout.on(‘data’, function (data) { var buffer = new Buffer(data); var str = iconv.decode(buffer, ‘gbk’); console.log(count+’ stdout: ’ + str); count++

if( count > MAX ){
    
    return;
}

});

这个return不起作用

9 回复

data事件每次触发都会调用回调函数,你加个return没有意义吧。

on(“xx” 的回调函数里面就没办法break吗?

@yakczh 你可以把if return条件写在回调函数的最前面来解决这个问题。

@syhd142  写到最前面就可以,这是什么原理?

@yakczh 回调函数每次data事件触发时还是会进去,每次count加1,直到满足条件就return了,后面的就不会执行了。

说明return在回调函数也是起作用的,我还以为回调函数有什么特殊的呢

if (condiction) {
  ls.kill('SIGINT'); // or ls.kill(0)
}

在遇到某一个情况的时候这样把子进程干掉就可以了。具体你想用什么方式来结束进程基本上都是 kill 方法里面传数字或者字符串的信号给子进程。如果你要分行的话用 pipe 多好:

var es = require('event-stream');
//....blabla
ls.stdout
  .pipe(es.split('\n'))
  .pipe(es.through(function(line) {
     if (condition) {
       ls.kill()
       this.queue(null)
     }
     // do other stuffs....
     // or pipe output to other dest stream
   }))

pipe 是管道,就是一边输出一边处理,不是全部输出完了,再处理,这就是你说的分行吧

@yakczh

是管道呀,不过我觉得用ondata事件来处理的话不如直接用pipe吧,可操作性也高一些 :p

回到顶部