Javascript/Angularjs: дождитесь выполнения обещания, прежде чем перейти к следующей итерации в цикле foreach.

Почти уверен, что мне не хватает чего-то незначительного здесь. Я применяю цикл javascript foreach к массиву объектов. В цикле я делаю асинхронный вызов API для обновления данных. Я хочу, чтобы цикл foreach дождался выполнения обещания, прежде чем перейти к следующей итерации.

Вот пример кода

entriesToUpdate.forEach(function (item) {   
    SomeService.updateEntry(item).then(function (res) {
        //Do some stuff here.
    });
    //Wait for the above promise to be fulfilled before going to next iteration 
});

person Kanban    schedule 20.01.2016    source источник


Ответы (1)


Вы можете определить функцию для рекурсивной обработки записей следующим образом:

function updateEntries(entries, i) {
  if(i < entries.length) {
    return SomeService.updateEntry(entries[i]).then(function() {
      return updateEntries(entries, i+1);
    });
  }
}
updateEntries(entriesToUpdate, 0);

Или вы можете связать свои обещания.

var promise = SomeService.updateEntry(entriesToUpdate[0]);
for(var i = 1; i < entriesToUpdate.length; i++) {
  promise = promise.then(function() {
    return SomeService.updateEntry(entriesToUpdate[i]);
  });
}

(Эти примеры могут не работать, я не знаком с промисами AngularJS. Только промисы ES6)

person Xenotoad    schedule 20.01.2016
comment
Спасибо, первое решение (рекурсивная функция) решило мою проблему :) - person Kanban; 21.01.2016