2013-07-02 64 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+