从子进程获取正确的进程ID

时间:2013-07-18 14:48:11

标签: node.js

所以,我正在产生一些进程,并在获取一些数据时试图找出进程的PID,这是我的代码:

var mod_child_process = require('child_process');
var mod_events        = require('events');

for (var i=0; i<3; ++i)
{
    var childProcess;

    childProcess = mod_child_process.spawn('HandShake.exe', ['N:192.168.200.250:3001:1', 'Q:TIME']);    

    childProcess.stdout.on('data', function(data) {         
    console.log('stdout (' + childProcess.pid + '): ' + data);
    });

}

它总是返回一个pid

stdout (78748): 18/7/13 15:46:26
stdout (78748): 18/7/13 15:46:26
stdout (78748): 18/7/13 15:46:27

提前致谢。

3 个答案:

答案 0 :(得分:8)

您遇到了变量childProcess的范围问题。 JavaScript中的变量是函数作用域。因此,该变量不是循环所独有的。

代码的简化示例,如何使用它:

for (var i = 0; i < 3; ++i) {
    var someNumber = i;

    setTimeout(function() {
        console.log(someNumber);
    }, 100);
}

输出:2, 2, 2

修复:

for (var i = 0; i < 3; ++i) {
    (function() {
        var someNumber = i;

        setTimeout(function() {
            console.log(someNumber);
        }, 100);
    })();
}

您希望将逻辑包装在closure中,以便变量childProcess与该范围一起存在。上面的代码输出了预期的0, 1, 2

答案 1 :(得分:3)

看起来像是一个关闭问题。将循环变量传递给函数,以便不影响范围。

var mod_child_process = require('child_process');
var mod_events        = require('events');

for (var i=0; i<3; ++i)
{
    var childProcess;
    childProcess = mod_child_process.spawn('cmd.exe');  
    displayid(childProcess);  
}

function displayid(childProcess){
    childProcess.stdout.on('data', function(data) {         
    console.log('stdout (' + childProcess.pid + '): ' + data);
    });
}

输出

stdout (368): Microsoft Windows [Version 6.2.9200]
stdout (20268): Microsoft Windows [Version 6.2.9200]
stdout (15728): Microsoft Windows [Version 6.2.9200]

没有它

stdout (10964): Microsoft Windows [Version 6.2.9200]
stdout (10964): Microsoft Windows [Version 6.2.9200]
stdout (10964): Microsoft Windows [Version 6.2.9200]

答案 2 :(得分:0)

有趣的事实:只需在var初始化程序中将let更改为for,就可以避免此问题!

但是,这仅在变量在循环范围内时才有效。在循环之前声明它,您将获得与var相同的结果。