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不起作用
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 是管道,就是一边输出一边处理,不是全部输出完了,再处理,这就是你说的分行吧
是管道呀,不过我觉得用ondata事件来处理的话不如直接用pipe吧,可操作性也高一些 :p