2015-06-26 87 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语句没有任何问题。 同步呼叫的唯一问题是,如果您在应用程序中有任何其他呼叫,它也会被阻止。 第一个将确保呼叫是异步的。并按顺序排列。我不认为这会造成任何堆栈阻塞或溢出问题。你也可以尝试。 –

相关问题