0

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

简而言之,我有一个从 API 库中多次调用的函数,需要确保它们都已完成,然后再继续。到目前为止,我已经设法使用出色的 caolan/async 库来处理我的同步/异步需求,但使用 API 库中的这个特定功能遇到了障碍。

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

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

出于绝望,我希望有一个笨拙的解决方案,我可以在我的程序中的某个时间点等待 5 秒,而所有现有的异步功能都已完成,但在 5 秒过去之前没有进一步的进展。因此,如果可能的话,我想要一个 5 秒的非阻塞暂停。

我可能可以使用光纤来做到这一点,但在我走这条路之前真的希望有另一个解决方案。

4

1 回答 1

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 但您可能想查看Promise A+

于 2013-07-02T20:06:14.130 回答