2013-07-02 60 views
0

我忙于一个node.js项目与一个API通信,该API涉及大量使用特定于该API的节点库。我已阅读(我认为)所有关于暂停和各种解决方案的问题的现有问题,但仍不确定如何对我的问题应用正确的解决方案。如何等待时间间隔?

简而言之,我有一个函数可以从API库中多次调用,并且需要确保它们在继续之前完成。到目前为止,我已经设法使用卓越的caolan /异步库来处理我的同步/异步需求,但是使用API​​库中的这个特定功能打开了一个块。

该函数非常复杂,因为它涉及https和SOAP调用/解析,所以我试图避免重写它与caolan/async行为,实际上我甚至不确定在这个阶段为什么它不好乖。

这是一个异步函数,我需要多次调用,然后等到所有的调用完成。我已经尝试过使用回调函数,甚至承诺(q库)的许多方法,但是无法按预期工作,并且我已成功完成其他异步API函数。

绝望之余,我希望有一个kludgy解决方案,我可以在程序中的某个点等待5秒钟,而所有现有的异步函数完成,但直到5秒后才能取得进一步的进展。所以我想要5秒的非阻塞暂停,如果这是可能的话。

我可能可以使用光纤做到这一点,但真正希望在我走下那条路线之前找到另一个解决方案。

+0

等待5秒的解决方案是一场噩梦,而不是你想要走下的道路。我强烈建议坚持承诺。这是满足您最佳需求的解决方案。休息一下,明天回来,明确的头脑,并修复现有的代码。 :-D – Brad

回答

0

解决您的问题的一个简单方法是在您每次调用函数时增加一个计数器。然后在回调结束时发出一个事件。听该事件,每次触发都会增加一个单独的计数器。当两个计数器相等时,您可以继续前进。

这将是这个样子

var function_call_counter = 0; 
var function_complete_counter = 0; 
var self = this; 

for(var i = 0; i < time_to_call; i++){ 

    function_call_counter++; 

    api_call(function(){ 
     self.emit('api_called');   
    }); 
} 

this.on('api_called', function(){ 
    function_complete_counter++; 
}); 

var id = setInterval(function(){ 
    if(function_call_counter == function_complete_counter){ 
     move_on(); 
     clearInterval(id); // This stops the checking 
    } 
}, 5000); // every 5 sec check to see if you can move on 

承诺应该工作还他们只是可能需要一些运用计谋。你提到了q,但你可能想要退房promises A+