我有以下Node.js代码:
var exec=require('child_process').exec;
var base_ctrl_port=8118;
var base_data_port=9050;
var nConns=10;
watchdogCycle();
setInterval(watchdogCycle, 60000); //check health every 60 seconds...
function watchdogCycle(){
console.log("\n");
for(var i=0;i<nConns;i++){
var data_port=base_data_port+i;
data_port=data_port+"";
var curl=exec('curl -b -s --socks5 localhost:'+data_port+' http://ifconfig.me',{timeout:10000},
function(err,stdout,stderr){
console.log(stdout);
if(err!=null){
getNewIP(i); //PROBLEM: i is always 10!!!
}
});
}
}
function getNewIP(offset){
console.log("Getting new IP address for tor data port: "+(base_data_port+offset+0)+"...");
var ctrl_port=base_ctrl_port+offset;
var nc=exec('(echo AUTHENTICATE \'\"xxxxxx\"\'; echo SIGNAL NEWNYM; echo quit) | nc localhost '+ctrl_port,
function(err,stdout,stderr){
console.log(stdout);
});
}
问题是i
中的参数getNewIP(i)
总是为10!
我已经阅读了一些有关递归的内容,但我不知道如何修改此代码,以便i
为0..9而不是总是10。
非常感谢,
答案 0 :(得分:3)
这是关闭问题......
试试这个:
for(var i=0;i<nConns;i++){
var data_port=base_data_port+i;
data_port=data_port+"";
(function (i){ // <-----
var curl=exec('curl -b -s --socks5 localhost:'+data_port+' http://ifconfig.me',{timeout:10000},
function(err,stdout,stderr){
console.log(stdout);
if(err!=null){
getNewIP(i); //PROBLEM: i is always 10!!!
}
});
})(i); // <-----
}
答案 1 :(得分:2)
简单地说你的问题与此成正比:
for(i = 0; i < 10; i++){
setTimeout(function(){ alert(i);}, 1000);
}
为了解决这个问题,您可以将代码包装在一个新函数中:
for(i = 0; i < 10; i++){
(function(otherI){
setTimeout(function(){ alert(otherI); }, 1000);
})(i)
}
这是人们在使用闭包时经常遇到的一个已知问题!
您可以参考此主题以获取更多信息,因为问题基本相同:Passing functions to setTimeout in a loop: always the last value?
这也是一个很好的参考: Javascript infamous Loop issue?
对于更易读的语法,您还可以执行以下操作:
for(i = 0; i < 10; i++){
with({i: i}){
setTimeout(function(){ alert(i);}, 1000);
}
}