2015-06-26 7 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.? – rtheunissen

+0

нет ничего плохого в заявлении while, которое вы пытаетесь. Единственная проблема с синхронными вызовами - если у вас есть какой-либо другой вызов в вашем приложении, он также будет заблокирован. Первый гарантирует, что вызовы будут асинхронными. и находятся в последовательности. Я не думаю, что это создало бы проблему блокировки стека или переполнения стека. Вы можете попробовать. –

Смежные вопросы