node.js 异步;计算回调

node.js async; counting callbacks

回调函数的实例计数在 node.js 中如何工作?

我在做learnyounode的第9个习题(下面是官方解法)。 据我了解,httpGet 函数被调用了三次,从 运行 到 process.argv[2]、[3] 和 [4]。但是怎么能数得过 === 3 呢?各个功能不就一个吗? httpGet 的一次调用如何知道其他的?

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)
        printResults()
    }))
  })
}

for (var i = 0; i < 3; i++)
  httpGet(i)

首先,最好不要使用 var

var 是在全局范围内定义的,因此它的值在调用之间更新

阅读更多关于 var here

But how could count ever === 3?

count 是在 httpGet 之外定义的,因此它的值独立于那些函数调用。 count++count = count + 1 相同,即每次调用 httpGet 都会将 count 的值增加 1。第三次调用该函数时,count 的值将是 3.

我们可以很容易地复制这个:

var count = 0;

function httpGet() {
  count++;
  console.log('count: ', count);
  if (count === 3) {
    console.log('count is 3');
  }
}

httpGet();
httpGet();
httpGet();