2015-11-16 7 views
0

Dears,Nodejs выполнение обещания последовательно

Как я могу запустить обещания nodejs последовательно, в следующем примере я перекручивание через массив часов, затем для каждого извлеченного результата часа Достаньте из базы данных, вопрос здесь: я получаю результаты но я хочу, чтобы он последовал в том же порядке, что у меня есть часы.

angular.forEach(SharedVar.getCategories(), function (h) { 
             t = h.split('-', 2); 
             t = t[0]; 
             RESTApi.getAnswerdCallsByHour(t).then(function (answerdTotal) { 
               $scope.answerdCallsTotalByHour.push(answerdTotal); 
               var d = SharedVar.getDataS(); 
               d[count] = answerdTotal; 
               SharedVar.setDataS(d); 

               count++; 

             }); 

           }); 

Спасибо,

ответ

0

Способ сделать это вательно будет сделать один запрос и сделать следующий запрос внутри обещание.

Я думаю, что лучший подход на сегодняшний день заключается в том, чтобы расширить вашу функцию SharedVar.setDataS (d) таким образом, чтобы она не зависела от последовательного получения данных. Как и SharedVar.setDataS (d, index) и используя конфигурацию var в вашем $ http.get (или любом другом) функциональном коду внутри вашего RESTApi, чтобы продвигать этот индекс до полного обещания.

Если RESTApi выглядит следующим образом:

var RESTApi = { 
    getAnswerdCallsByHour : function(hour) { 
    var url = "bla.com/myservice?hour=" + hour; 
    return $http.get(url).data; 
    } 
    // Some other Methods... 

Тогда вам нужен способ, чтобы передать что-то «изменить порядок» ваши данные, когда он прибывает асинхронно, то это может быть индекс вы подсчитывать или в вашем случае может быть час переменный:

var RESTApi = { 
    getAnswerdCallsByHour : function(hour) { 
    var url = "bla.com/myservice?hour=" + hour; 
    var config = []; 
    config.hour = hour; 
    return $http.get(url, config); // Return the promise not just data or a specific field 
    } 
    // Some other Methods... 

Теперь, когда ваше обещание fullfiled вы можете получить доступ к "часу" Variable так:

var d = SharedVar.getDataS(); 
d[promise.config.hour] = promise.data; 
SharedVar.setDataS(d); 

Теперь вы знаете, какая часть данных коррелирует с запросом, и вам не нужно получать данные по порядку. Последняя часть работает правильно только когда часы работает последовательный от 0 до 23, если это не так, вам нужно:

var RESTApi = { 
    getAnswerdCallsByHour : function(hour, index) { 
    var url = "bla.com/myservice?hour=" + hour; 
    var config = []; 
    config.index = index; 
    return $http.get(url, config); 
    } 
    // Some other Methods... 
    ... 
    ... 
    var d = SharedVar.getDataS(); 
    d[promise.config.index] = promise.data; 
    SharedVar.setDataS(d); 
+0

Я попытался предложить, все еще сталкиваясь с тем же вопросом. то, что я сделал, передает индекс в SharedVar.setData (d, index). о RESTApi просто извлекает данные из базы данных и возвращает счет. –

+0

Да, не совсем ясно, есть ли у меня то, что я пытался сказать. Я добавил код к моему ответу. – reineckm

0
var promise = Promise.resolve(); // make an empty promise in the way you do it with your promise library 
angular.forEach(SharedVar.getCategories(), function (h) { 

    promise.then(function() { 
     return RESTApi.getAnswerdCallsByHour(t).then(function (answerdTotal) {}); 
    }); 

}); 
+0

Все еще проблема с вашим решением. каждый раз, когда я запускаю приложение, я получаю результаты не в порядке. –

0

ответ Сафари как я обычно справиться с этим. (Извините, у меня недостаточно комментариев, чтобы прокомментировать ...) У вас возникли проблемы с ним, потому что предоставленный пример не захватывает и не использует новое обещание в последующих циклах. См. Мои комментарии к немного измененной версии здесь:

var promise = Promise.resolve(); 
    angular.forEach(SharedVar.getCategories(), function (h) { 
     t = h.split('-', 2); 
     t = t[0]; 

     // You must capture the new promise here; the next loop will wait 
     // for the promise returned from getAnswerdCallsByHour to resolve. 
     promise = promise.then(function() { 
      // Halt downstream promises until this returned promises finishes 
      return RESTApi.getAnswerdCallsByHour(t).then(function (answerdTotal) { 
       $scope.answerdCallsTotalByHour.push(answerdTotal); 
       var d = SharedVar.getDataS(); 
       d[count] = answerdTotal; 
       SharedVar.setDataS(d); 

       count++; 
      }); 
     }); 
    }); 
Смежные вопросы