我尝试将其作为来自nodeschool的教程,并且对Node.js还是陌生的。下面的代码,我知道其中的问题,但我无法解决它。问题在于,对于bl函数内部的每次循环,j的值为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是一个异步请求,但是for同步,因此for是“最快”,当http.get完成下载url数据时,变量“ j”将取最后一个值。
我认为您还有另一个错误,在您的for循环中,将变量“ j”增加为“ ++ j”,它将是“ j ++”。
要解决第一个问题(变量“ 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));
}
关于javascript - 在Node.js中将循环计数器作为参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31097119/