Angularjs обещают внутри цикла for

0

У меня есть следующий код, который перебирает список отчетов, меняет каждое имя и обновляет его. Он отлично работает, если в списке есть только один отчет, но если есть 2 отчета, то обновляется только второй.

Когда я посмотрел на вкладку сети, я увидел, что для первого отчета был только вызов GET, но для второго отчета были оба вызова GET и PATCH.

Мое подозрение в том, что в этом цикле async переменная thisReport перезаписывается, когда возвращается второй отчет GET, а затем он обновляет второй отчет. Первый отчет не получил возможности обновиться.

Мой вопрос: как мне переписать код, чтобы все отчеты в списке могли обновляться. Извините за вопрос о новичке. Все советы приветствуются!

for (var i = 0; i < $scope.listOfReports.length; i++) {
  var reportId = $scope.listOfReports[i].Id;
  if (reportId > 0) {
    var thisReport = reportSvc.query({ key: reportId });
    thisReport.$promise.then(function (data) {
        thisReport.name = newValue;
        thisReport.$update({ key: reportId }).then(function () {
        });
    });
}}
  • 1
    Возможно, потому что к моменту разрешения первого запроса thisReport уже ссылается на новый thisReport. То же самое относится и к reportId. Я думаю, что в любом случае у вас есть проблемы с определением объема работ.
  • 0
    да @matmo я тоже так думал ... есть идеи как переписать, чтобы избежать проблем с областью видимости?
Теги:
for-loop
angular-promise

1 ответ

1

После дополнительных исследований я узнал, что это замыкание внутри шаблона цикла, и я исправил это, создав функцию для логики, которая изначально была внутри цикла. новый код ниже

for (var i = 0; i < $scope.listOfReports.length; i++) {
 var reportId = $scope.listOfReports[i].Id;
 UpdateValue(reportId, ANewName);    
}

function UpdateValue(reportId, newName)
{
   if (reportId > 0) {
     var thisReport = reportSvc.query({ key: reportId });
     thisReport.$promise.then(function (data) {
        thisReport.name = newName;
        thisReport.$update({ key: reportId }).then(function () { });
     });
   }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню