stdout在向生成的进程发送多个请求时进行备份

时间:2014-01-17 19:35:46

标签: javascript node.js bash

我遇到了一个奇怪的问题,当我生成一个进程并保持该生成的进程对多个请求保持活动状态时,该进程的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:

1 个答案:

答案 0 :(得分:2)

如果您使用on,则每次收到stdout上的某些数据时都会调用您的事件处理程序。 您可能希望使用once,因此一旦data事件被触发,您的事件处理程序将立即被删除。 或者,您可以使用removeListener(event, listener)removeAllListeners(event)删除旧的听众。