Node.js - 请帮我递归

时间:2013-06-20 12:30:02

标签: javascript node.js

我有以下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。

非常感谢,

2 个答案:

答案 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);
    }
}