learnyounode#9杂耍async,官方解决方案可以破解吗?

时间:2015-07-11 04:34:49

标签: node.js asynchronous race-condition

所以我现在正在学习node.js并且之前已经完成了一些多任务处理,我的概念是异步和多任务处理有许多类似的问题,这让我想到了我的问题。

此问题的官方解决方案是:

  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()
          //AREA OF INTEREST START
          count++

          if (count == 3)
            printResults()
          //AREA OF INTEREST END
        }))
      })
    }

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

请注意“利益范围”评论中的部分。是否有可能在这里发生类似竞争条件的事情,导致多次调用printResults函数?

例如,所有三个'end'回调同时出现,每个回调都一个接一个地执行count++(所以count == 3检查在任何回调上都没有发生但是计数已经增加了三倍)他们每个人都会检查count == 3条件,这对所有人来说都是正确的,因此调用printResults三次

这是否可行,官方解决方案有些缺陷或者我是否误解了一些概念?

1 个答案:

答案 0 :(得分:1)

不,竞争条件不是该代码的问题。回调在单个线程中运行。它们不会同时并行运行。它们将连续运行。

有关回调如何排队的详细信息以及代码中没有竞争条件的原因,您可以选择观看a great video by Philip Roberts called "What the heck is the event loop anyway?"