Как приостановить итерацию, используя сервис $ q? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь использовать службу $ q для паузы в итерации, потому что у меня есть условие делать вызовы API в цикле.

Я использовал следующий подход:

function getData(id){
   var deferred = $q.defer();
   var data;
   Restangular.all("some/api").post(id)
       .then(function (result) {
            data = result;
            doSomeFurtheProcessingWithData(data);
            console.log("Data fetched for "+id);
            deferred.resolve(data);
         }, function(error) {
              deferred.resolve(data);
         });
   return deferred.promise;
}

function getDataOneByOne(ids){
   for(var i=0;i<ids.length;i++){
      console.log("Fetching details for "+ ids[i]);
      getData(ids[i]);
   }
}

Я ожидаю, что результат будет

Выборка данных для 101
Выборка данных для 101
Выборка данных для 102
Выборка данных для 102
Выборка данных для 103
Выборка данных для 103

Но фактический результат, приведенный выше, код дает

Извлечение подробностей для 101
Извлечение подробностей для 102
Извлечение данные для 103
Данные получены для 101
Данные получены для 102
Данные получены за 103

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Можете ли вы попытаться использовать await / async, чтобы дождаться возвращения обещания перед повторением цикла?как ниже

function getData(id){
   var deferred = $q.defer();
   var data;
   Restangular.all("some/api").post(id)
       .then(function (result) {
            data = result;
            doSomeFurtheProcessingWithData(data);
            console.log("Data fetched for "+id);
            deferred.resolve(data);
         }, function(error) {
              deferred.resolve(data);
         });
   return deferred.promise;
}



function getDataOneByOne(ids){
  if(ids.length > 0){
    var id = ids.shift();
    console.log("Fetching details for "+ id);
    getData(id).then(function(){
      getDataOneByOne(ids);
    });

  }

}

getDataOneByOne([1,2,3,4,5,]);
0 голосов
/ 27 июня 2019

Это может быть смоделировано с использованием рекурсии и глобального индекса.Асинхронное ожидание решения остается лучше:

   var index = 0; 
   function getDataOneByOne(ids){
       if (index >= ids.length){
          return;
       }
       console.log("Fetching details for "+ ids[index]);
       getData(ids[index]).then(function () {
           index++;
           getDataOneByOne(ids);
       });
    }
0 голосов
/ 27 июня 2019

https://blog.hellojs.org/use-reduce-and-promises-to-execute-multiple-async-calls-sequentially-4caf03a34b9a

Используйте .reduce для последовательного разрешения обещаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...