在Node.js中传递循环计数器作为参数

我正在尝试这从nodechool的教程,我是新Node.js。 代码如下,我知道它的问题,但我无法解决它。 问题是j在bl函数内循环的每次迭代中都有3的值 ,但是为什么会发生这种情况呢?

var bl = require('bl'); var http = require('http'); var urls = process.argv.slice(2); var result = []; for (var i = 0; i < urls.length; i++) { result.push(null); } for(j = 0 ; j < urls.length; ++j){ http.get(urls[j],function(response){ response.pipe(bl(function(err,data){ //console.log(result[i]); //console.log(data.toString()); result[j] = data.toString(); console.log('J : ' + j); console.log(data.toString()); var flag = 0; for (var i = 0; i < result.length; i++) { console.log('here1'); console.log(result[i]); if(result[i] == null){ flag = 1; console.log('here'); break; } } if(flag == 0){ for (var i = 0; i < result.length; i++) { console.log(result[i]); } } })); }); } 

http.get是一个asynchronous请求,但for是同步所以为“最快”,当http.get完成下载url数据时,variables“j”取最后一个值。

你有另外一个错误我想,在你的for循环中,你把variables“j”增加为“++ j”,它会变成“j ++”。

要解决第一个问题(variables“j”值),可以使用匿名函数并传递值“j”,如:

 for(j = 0 ; j < urls.length; j++) { (function(j) { http.get(urls[j],function(response){ response.pipe(bl(function(err,data){ //console.log(result[i]); //console.log(data.toString()); result[j] = data.toString(); console.log('J : ' + j); console.log(data.toString()); var flag = 0; for (var i = 0; i < result.length; i++) { console.log('here1'); console.log(result[i]); if(result[i] == null){ flag = 1; console.log('here'); break; } } if(flag == 0){ for (var i = 0; i < result.length; i++) { console.log(result[i]); } } })); }); }(j)); } 

有很多的代码,但在履历我这样做:

 for(j = 0 ; j < urls.length; j++) { (function(j) { /* your code inside this function will have the correct value to variable "j" if you use async methods */ } (j)); }