【问题标题】:node.js async; counting callbacksnode.js 异步;计算回调
【发布时间】:2021-08-08 03:27:37
【问题描述】:

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

我正在学习learnyounode的第9个练习(在官方解决方案下方)。 据我了解,httpGet函数被调用了3次,分别通过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)

【问题讨论】:

    标签: javascript node.js http callback get


    【解决方案1】:

    但怎么能数到 === 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();

    【讨论】:

    • 再次感谢菲利克斯!那么,如果在调用函数 getHttp 和它执行到 count++ 点之间 count 的值增加,它会在增加的值上 +1 吗?我认为它可能只是增加 count 的值,就像调用函数时一样。
    • count 的值直到表达式 count++ 被执行后才会被读取。而且由于 JavaScript 是单线程的并且具有“运行到完成”的概念,因此可以保证没有两个函数可以同时执行该行,或者一个函数在另一个函数读取值并更新它之间更新值。跨度>
    • 非常感谢,这消除了一个根本的误解 :)
    【解决方案2】:

    首先,不要使用var

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

    阅读更多关于varhere

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2013-12-15
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 2012-07-15
      • 2018-04-29
      相关资源
      最近更新 更多