这里需要解决三个问题:
首先
,您期望异步使用stdout时出现同步行为。
run_cmd函数中的所有调用都是异步的,因此无论是否已从stdout读取部分,全部或没有数据,它都会生成子进程并立即返回。因此,当您跑步时
console.log(foo.stdout);
您会得到当前存储在foo.stdout中的所有信息,并且无法保证会发生什么,因为您的子进程可能仍在运行。
其次
是stdout是可读流,因此1)可以多次调用数据事件,以及2)给回调函数提供缓冲区,而不是字符串。易于补救;只是改变
foo = new run_cmd( 'netstat.exe', ['-an'], function (me, data){me.stdout=data;});
进入
foo = new run_cmd( 'netstat.exe', ['-an'], function (me, buffer){me.stdout+=buffer.toString();});
这样我们就可以将缓冲区转换为字符串并将该字符串附加到我们的stdout变量中。
第三点 是,您只有在收到’end’事件时才能知道已收到所有输出,这意味着我们需要另一个侦听器和回调:
function run_cmd(cmd, args, cb, end) { // ... child.stdout.on('end', end);}
因此,您的最终结果是:
function run_cmd(cmd, args, cb, end) { var spawn = require('child_process').spawn, child = spawn(cmd, args), me = this; child.stdout.on('data', function (buffer) { cb(me, buffer) }); child.stdout.on('end', end);}// Run C:WindowsSystem32netstat.exe -anvar foo = new run_cmd( 'netstat.exe', ['-an'], function (me, buffer) { me.stdout += buffer.toString() }, function () { console.log(foo.stdout) });
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)