Javascript Node.js——请帮助我处理递归
我有以下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
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看一下我的编辑!你现在了解了用解决那样的闭包“问题”了吗?