我遇到了一个奇怪的问题,当我生成一个进程并保持该生成的进程对多个请求保持活动状态时,该进程的stdout似乎保持一个活动计数,它被调用多少次并使用stdout计数。上。在这个例子中,我正在生成一个简单的bash脚本,它回显了传递给它的内容,节点文件通过spawn向这个脚本发送请求。我已经粘贴了我认为我的结果应该是什么,以及它们实际上是什么。这是怎么回事?
// echo-me bash script
#!/bin/bash
while [[ 1 == 1 ]]; do
read input
echo "echoing $input"
done
// echo-me node script
var spawn = require('child_process').spawn;
var cmd = spawn('./echo-me',[]);
function echoMe(conn,req,callback) {
var res;
conn.stdin.write(req+'\n');
conn.stdout.setEncoding('utf8');
conn.stdout.on('data', function(data) {
res = data.trim();
console.log('1 -> '+res+':');
return callback(res);
});
}
echoMe(cmd,'test1', function(res) {
console.log('2 -> '+res+':');
});
setTimeout(function() {
echoMe(cmd,'test2', function(res) {
console.log('2 -> '+res+':');
});
},1000);
setTimeout(function() {
echoMe(cmd,'test3', function(res) {
console.log('2 -> '+res+':');
});
},2000);
//预期结果
1 -> echoing test1:
2 -> echoing test1:
1 -> echoing test2:
2 -> echoing test2:
1 -> echoing test3:
2 -> echoing test3:
//实际结果
1 -> echoing test1:
2 -> echoing test1:
1 -> echoing test2:
2 -> echoing test2:
1 -> echoing test2:
2 -> echoing test2:
1 -> echoing test3:
2 -> echoing test3:
1 -> echoing test3:
2 -> echoing test3:
1 -> echoing test3:
2 -> echoing test3:
答案 0 :(得分:2)
如果您使用on
,则每次收到stdout
上的某些数据时都会调用您的事件处理程序。
您可能希望使用once
,因此一旦data
事件被触发,您的事件处理程序将立即被删除。
或者,您可以使用removeListener(event, listener)
或removeAllListeners(event)
删除旧的听众。