我指的是这个nodetuts教程,用于协调NodeJ中的并行调用。 http://nodetuts.com/series/asynchronous-programming/mastering-asynchronous-programming-02.html
我需要你帮助理解。
callback1,callback12,callback3是需要并行执行的函数。每个人都有自己的时间来执行。
但是他们的结果按相应的顺序存储在结果数组中
[resultofcallback1, resultofcallback2, resultofcallback3]
最终回调的唯一合约,只执行一次并以正确的顺序显示结果,如上所述。
为此,我们有一个Boolean calledBack
来确保它只执行一次。
请参阅以下代码
我的论点是在执行callBack1时。
内部handleResult
:pending =0
,order = 0, pending is incremented to 1
假设这个回调花费最少的时间来执行。
此handleResult pending is decremented
的返回函数内
这使得pending 0
。让我们说这个时候没有其他的callBack (callback1 ,callback2)
已经达到了他们的handlResult函数,因此挂起仍为0.所以这个if(!pending)断言和最后一个callBack被调用callback(null, results);
只输出一个像{的结果{1}},其余两个为空,因为最后的回调应该只被调用一次。
[resultofCallback1,'','']
这是协调并行呼叫的正确方法吗? 我错过了什么吗?
答案 0 :(得分:0)
您可以随时使用异步并行或类似的东西。
对于手动实施,您可以执行以下操作之一:
1-长轮询已完成任务的数量。如果完成的任务数量==总的任务数量=>最终回调
2-在每个回调结束时,发送一个"我已完成"发出信号并检查“我完成了”的数量"信号。如果"我已完成"信号等于任务总数=>最后的回调。
看起来你正在采用第二种方法。检查你的代码,我没有看到你遗漏任何方面,但你有一个大问题:
如果您的第一个任务在注册第二个任务之前完成,则仅使用第一个任务的结果执行最终回调。
重申:你注册任务的方式会带来一种竞争条件,这种竞争条件在很大程度上取决于你从随机超时中滚动到足够高的事实,这样你就可以在你注册的任务完成之前注册所有任务。
建议修复:在成功注册所有任务之前,请不要启动任何任务。
另外:如果你在0开始挂起并执行order = pending,当你注册3个任务并且没有完成任务时你得到pending = 2,并且在第二个任务完成并且第3个任务仍在进行之后,你执行最后的回调。