如何等待时间间隔?

时间:2013-07-02 19:57:20

标签: node.js

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

简单地说,我有一个函数,我从API库中多次调用,需要确保它们在继续之前完成所有操作。到目前为止,我已经设法使用优秀的caolan / async库来处理我的同步/异步需求,但是使用API​​库中的这个特定函数来阻止它。

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

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

出于绝望,我希望有一个kludgy解决方案,我可以在我的程序中的某一点等待5秒钟,同时所有现有的异步功能完成但直到5秒后才进一步进展。如果可能的话,我想要一个5秒的非阻塞暂停。

我可以使用光纤这样做,但在我沿着那条路走下去之前真的希望有另一种解决方案。

1 个答案:

答案 0 :(得分: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+