Javascript节点学校异步挑战。我搞砸了异步代码

时间:2015-06-23 20:14:06

标签: javascript

所有这些代码都在一个名为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]对吗?那么结果数组的第一个元素应该包含正确的东西而不是未定义的?

显然,我的思想和代码都被打破了。我在哪里错误地解决这个问题?

顺便说一句:我看了关闭的相关帖子,但我仍然不明白为什么我的代码被破坏或者它的失败。

1 个答案:

答案 0 :(得分:1)

在第一个例子中,你的变量{{1}}是一个引用,所以循环以i的最大值结束,然后调用你所有的回调并使用引用i - 它将被设置为相同将状态作为for循环的结束。

在你的第二个中,计数被保存到闭包中的另一个变量中。