我正在忙于一个与应用程序接口通信的node.js项目,这涉及到大量使用特定于该应用程序接口的节点库。我已经阅读了(我认为)关于暂停所涉及的各种问题的所有现有问题以及它们的各种解决方案,但仍然不确定如何将正确的解决方案应用于我的问题。
简而言之,我有一个从API库中多次调用的函数,需要确保它们都已完成,然后才能继续。到目前为止,我已经成功地使用了优秀的caolan/async库来处理我的同步/异步需求,但使用API库中的这个特定函数遇到了障碍。
这个函数非常复杂,因为它涉及https和SOAP调用/解析,所以我试图避免重写它来表现caolan/async的行为,事实上,在这个阶段我甚至不确定为什么它表现不好。
它是一个异步函数,我需要多次调用它,然后等待所有调用完成。我已经尝试了许多使用回调甚至promises (q库)的方法,但就是不能让它像预期的那样工作,就像我已经成功地使用其他异步API函数一样。
出于绝望,我希望有一个笨拙的解决方案,我可以在我的程序中的某一点上等待,比如说5秒,而所有现有的异步函数都完成了,但直到5秒过去才会取得进一步的进展。因此,如果可能的话,我想要一个5秒的非阻塞暂停。
我也许可以使用光纤来实现这一点,但我真的希望在我沿着这条路走下去之前能找到另一种解决方案。
发布于 2013-07-03 04:06:14
问题的一个简单解决方案是在每次调用函数时递增一个计数器。然后在回调的末尾让它发出一个事件。侦听该事件,并在每次触发该事件时递增一个单独计数器。当两个计数器相等时,您可以继续。
这看起来像这样
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+
https://stackoverflow.com/questions/17434715
复制相似问题