2015-06-26 129 views
-2

我正在編寫一個僅用於服務器的應用程序,它從API中提取數據,檢查是否有新的數據,並向所有連接發出更新。唯一的限制是更新必須按照它們創建的順序(按時間順序或按PK)發出,並且請求可能會受到先前請求的響應的影響。如何在提出下一個請求之前等待響應?

我面臨的問題是,當請求需要很長時間,另一個請求可能會超過它,並開始發佈更新「不按順序」。

解決此問題的最佳方法是什麼?理想情況下,我想這個流程:

request -> response -> emit ... request -> response -> emit ...

注:如果請求失敗或超時,我想重試至少X倍。

+0

可能是你可以使用[特點](https://github.com/FuturesJS/sequence) –

回答

0

可以使用回調

function check(){ 
    //request to the api 
    http.get("http://www.google.com/index.html", function(res) { 
      console.log("Got response: " + res.statusCode); 
      // here you can emit your events 
      // do your events 
      // after done your events, you can call check again 
      check() 
    }).on('error', function(e) { 
      console.log("Got error: " + e.message); 
    }); 
} 

check() 
0

有兩種快捷方式對付這個。

  1. 可以使用回調,並使用您的函數遞歸

    var myCall = function(){ 
        var request = new XMLHttpRequest(); 
        request.open(<request_method>, <request_url>, true); 
        request.send(null); 
    
        if (request.status === 200) { 
         //put your emit function here 
         myCall(); 
        } 
    } 
    myCall(); 
    
  2. 您可以撥打電話同步。我不會推薦這個,如果你一直在不斷呼籲

    var myCall = function(){ 
        var request = new XMLHttpRequest(); 
        request.open(<request_method>, <request_url>, false); //false makes it synchronous 
        request.send(null); 
    
        if (request.status === 200) { 
         //put your emit function here 
        } 
    } 
    myCall(); 
    myCall(); 
    myCall(); 
    myCall(); 
    . 
    . 
    . 
    as many times as u want 
    
+0

豈不第一個解決方案結束有大量的堆棧/溢出?有什麼不對(真){myCall(); 2.在2.? – rtheunissen

+0

您嘗試的while語句沒有任何問題。 同步呼叫的唯一問題是,如果您在應用程序中有任何其他呼叫,它也會被阻止。 第一個將確保呼叫是異步的。並按順序排列。我不認爲這會造成任何堆棧阻塞或溢出問題。你也可以嘗試。 –

相關問題