所有这些代码都在一个名为juggling_async.js的文件中。节点学校的练习9。
这段代码坏了(我写了):
var http = require('http');
var bl = require('bl');
var result = [];
var count = 0;
for(var i=0;i<3;i++) {
http.get(process.argv[2 + i], function(res){
res.pipe(bl(function(err,data){
if(err) return console.log(err.message);
result[i] = data.toString();
count++;
if(count == 3) {
for(var j=0;j<result.length;j++) {
console.log(result[j]);
}
}
}));
});
}
注销:
&#34;未定义&#34;
&#34;未定义&#34;
&#34;未定义&#34;
&#34; [这是一串文字]&#34;
此代码解决了问题:
var http = require('http')
var bl = require('bl')
var results = []
var count = 0
function printResults () {
for (var i = 0; i < 3; i++)
console.log(results[i])
}
function httpGet (index) {
http.get(process.argv[2 + index], function (response) {
response.pipe(bl(function (err, data) {
if (err)
return console.error(err)
results[index] = data.toString()
count++
if (count == 3) // yay! we are the last one!
printResults()
}))
})
}
for (var i = 0; i < 3; i++)
httpGet(i)
在我看来,我破碎的代码应该可行。我开始循环遍历i,我从0开始,我使用http库发出http.get请求,http.get接受回调,其中res是http.get请求的响应。 function(res)是在get请求返回之前不会运行的回调吗?那时,我仍然是0,所以我将data.toString()设置为结果[0]对吗?那么结果数组的第一个元素应该包含正确的东西而不是未定义的?
显然,我的思想和代码都被打破了。我在哪里错误地解决这个问题?
顺便说一句:我看了关闭的相关帖子,但我仍然不明白为什么我的代码被破坏或者它的失败。
答案 0 :(得分:1)
在第一个例子中,你的变量{{1}}是一个引用,所以循环以i的最大值结束,然后调用你所有的回调并使用引用i - 它将被设置为相同将状态作为for循环的结束。
在你的第二个中,计数被保存到闭包中的另一个变量中。