所以,我正在产生一些进程,并在获取一些数据时试图找出进程的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
提前致谢。
答案 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
相同的结果。