所以我现在正在学习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 已增加三次),现在每个回调都会检查 count == 3
条件,这对于所有调用 printResults
三次的情况都是 true
这可能吗,官方解决方案有些缺陷,还是我误解了一些概念?
我是一名优秀的程序员,十分优秀!