所以我现在正在学习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函数吗?
例如,所有三个“结束”回调同时执行,每个回调都一个接一个地执行count++ (因此count == 3检查还没有发生在任何回调上,但计数增加了三次),现在每个回调都将检查count == 3条件,这对于所有调用printResults三次都是正确的。
这是可能的吗?官方的解决方案是否有一些缺陷?还是我误解了一些概念?
发布于 2015-07-11 04:37:19
不,比赛条件不是那个代码的问题。回调在一个线程中运行。他们不会同时运行。他们将以串联的方式运行。
有关回调是如何排队的以及代码中为什么没有竞争条件的更多信息,您可以选择查看菲利普·罗伯茨()的一段很棒的视频名为“事件循环到底是什么?”。
https://stackoverflow.com/questions/31353448
复制相似问题