Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js——请帮助我处理递归_Javascript_Node.js - Fatal编程技术网

Javascript Node.js——请帮助我处理递归

Javascript Node.js——请帮助我处理递归,javascript,node.js,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(){ cons

我有以下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);
        });
}
var exec=require('child_process')。exec;
var base\u ctrl\u port=8118;
var base_数据_端口=9050;
var nCons=10;
看门狗周期();
设置间隔(看门狗周期,60000)//每60秒检查一次健康状况。。。
函数watchdogCycle(){
控制台日志(“\n”);

对于(var i=0;i这是闭包的问题

试试这个:

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); // <-----
}

for(var i=0;i这是闭包的问题

试试这个:

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); // <-----
}

for(var i=0;i简单地说你的问题与此成正比:

for(i = 0; i < 10; i++){
    setTimeout(function(){ alert(i);}, 1000);
}
(i=0;i<10;i++)的
{
setTimeout(函数(){alert(i);},1000);
}
为了解决此问题,您可以使用新函数包装代码:

for(i = 0; i < 10; i++){
    (function(otherI){
        setTimeout(function(){ alert(otherI); }, 1000);
    })(i)
}
(i=0;i<10;i++)的
{
(功能(其他i){
setTimeout(函数(){alert(otherI);},1000);
})(一)
}
这是人们在使用闭包时经常遇到的一个已知问题

您可以参考此线程了解更多信息,因为问题基本相同:

这也是一个很好的参考:

要获得更可读的语法,还可以执行以下操作:

for(i = 0; i < 10; i++){
    with({i: i}){
        setTimeout(function(){ alert(i);}, 1000);
    }
}
(i=0;i<10;i++)的
{
带({i:i}){
setTimeout(函数(){alert(i);},1000);
}
}

简单地说你的问题与此成正比:

for(i = 0; i < 10; i++){
    setTimeout(function(){ alert(i);}, 1000);
}
(i=0;i<10;i++)的
{
setTimeout(函数(){alert(i);},1000);
}
为了解决此问题,您可以使用新函数包装代码:

for(i = 0; i < 10; i++){
    (function(otherI){
        setTimeout(function(){ alert(otherI); }, 1000);
    })(i)
}
(i=0;i<10;i++)的
{
(功能(其他i){
setTimeout(函数(){alert(otherI);},1000);
})(一)
}
这是人们在使用闭包时经常遇到的一个已知问题

您可以参考此线程了解更多信息,因为问题基本相同:

这也是一个很好的参考:

要获得更可读的语法,还可以执行以下操作:

for(i = 0; i < 10; i++){
    with({i: i}){
        setTimeout(function(){ alert(i);}, 1000);
    }
}
(i=0;i<10;i++)的
{
带({i:i}){
setTimeout(函数(){alert(i);},1000);
}
}

getNewIP的代码在哪里?您不使用node csv的原因是什么?您的问题不是关于递归而是Closure getNewIP的代码在哪里?您不使用node csv的原因是什么?您的问题不是关于递归而是closures@Eamorr理解这一点是区分javascript初学者和真正的javascript developer。异步函数不会在您认为会在同一上下文中被调用(i的值不是函数定义之外的直接值)。请阅读以下内容以获得正确的解释:.Protip:Read“javascript,好的部分”douglas crockford所著。这是一本小书。@Eamorr了解这一点的原因是将javascript初学者与合适的javascript开发人员区分开来的原因。异步函数不会像您认为的那样在同一上下文中被调用(i的值不是函数定义之外的直接值)。请阅读以下内容以获得正确的解释:.Protip:阅读道格拉斯·克罗克福德的《javascript,好的部分》。这是一本小书。@raam86看一下我的编辑!你现在是否了解了用
解决那样的闭包“问题”?@raam86看一下我的编辑!你现在了解了用
解决那样的闭包“问题”了吗?