CNode

child_process在执行命令后,stdout.on("data" 怎么样在遇到指定字符串或者条件时退出?

Yyakczh发布于12 年前最后回复12 年前9 回复8869 浏览0 收藏

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)

Y
yakczh#1·12 年前
S
syhd142#2·12 年前
引用 syhd142data事件每次触发都会调用回调函数,你加个return没有意义吧。

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

Y
yakczh#3·12 年前
引用 syhd142data事件每次触发都会调用回调函数,你加个return没有意义吧。

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

S
syhd142#4·12 年前
引用 syhd142data事件每次触发都会调用回调函数,你加个return没有意义吧。

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

Y
yakczh#5·12 年前

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

S
syhd142#6·12 年前

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

K
kiddkai#7·12 年前
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
   }))
参与回复
登录后即可参与回复。登录