7

因此,我正在生成一些进程并试图在它获取一些数据时找出进程的 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

提前致谢。

4

3 回答 3

9

您遇到了变量的范围界定问题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);
    })();
}

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

于 2013-07-18T14:59:09.697 回答
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]
于 2013-07-18T14:59:42.850 回答
1

有趣的事实:只需更改var到初始化程序let内部,您就可以避免这个问题!for

但是请注意,这仅在变量在循环范围内时才有效。在循环之前声明它,你会得到与var.

于 2018-11-22T13:08:23.503 回答