我正忙于与API通信的node.js项目,该API涉及大量使用特定于该API的节点库。我已阅读(我认为)有关暂停所涉问题的所有现有问题及其各种解决方案,但仍不确定如何为我的问题应用正确的解决方案。
简单地说,我有一个函数,我从API库中多次调用,需要确保它们在继续之前完成所有操作。到目前为止,我已经设法使用优秀的caolan / async库来处理我的同步/异步需求,但是使用API库中的这个特定函数来阻止它。
该函数非常复杂,因为它涉及https和SOAP调用/解析,所以我试图避免重写它以使用caolan / async行为,事实上我甚至不确定在这个阶段为什么它表现不佳
这是一个异步功能,我需要多次调用,然后等待所有调用完成。我已经尝试了许多使用回调甚至承诺(q库)的方法,但是无法让它按预期工作,并且我已成功完成其他异步API函数。
出于绝望,我希望有一个kludgy解决方案,我可以在我的程序中的某一点等待5秒钟,同时所有现有的异步功能完成但直到5秒后才进一步进展。如果可能的话,我想要一个5秒的非阻塞暂停。
我可以使用光纤这样做,但在我沿着那条路走下去之前真的希望有另一种解决方案。
答案 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+