Вызов службы внутри цикла не останавливает цикл, даже если условие ложно

Я хочу прекратить повторный звонок getModelData если shouldPermit становится true, Но ниже код всегда печатает why I got printed forEach newlySelectedUsers в консоли для каждого newlySelectedUsers,

var shouldPermit = false;
angular.forEach(newlySelectedUsers, function(value, key) {
if(!shouldPermit) { 
console.log("why I got printed forEach newlySelectedUsers")                         
userService.getModelData($scope.$root.test[value].id)
.success(function (data) {                                
    if(lodash.isEmpty(data)) {                                      
        shouldPermit = true;
        $scope.insertSaving();
     }
       });                           
         }                      
          });

Как прекратить звонки на getModelData один раз shouldPermit становится правдой?

2 ответа

Решение

Это потому, что все http-запросы выполняются асинхронно. Это говорит о том, что ваше изменение выполняется быстрее, чем время, необходимое службе для поиска (в вашем случае) пустой переменной данных.

Один из вариантов - рекурсивно вызвать запрос http:

const totalNewlySelectedUsers = newlySelectedUsers.length;


function getUser(idx) {

    let value = newlySelectedUsers[idx];

    userService.getModelData($scope.$root.test[value].id)
        .success(function (data) {
            if (lodash.isEmpty(data))
                $scope.insertSaving();
                return;
            }

            if(idx === totalNewlySelectedUsers) return;

            getUser(idx + 1);
        });

}

getUser(0);

Это из-за асинхронности. Вторая итерация не ждет userService.getModelData() вызывается для первой итерации до конца. Таким образом, вы получаете консольное сообщение еще до того, как оно перейдет в функцию успеха первой итерации. userService.getModelData() где вы меняете shouldPermit к истине.

Вместо этого вы просто двигаетесь shouldPermit = true; наверх, чтобы решить проблему.

var shouldPermit = false;
angular.forEach(newlySelectedUsers, function(value, key) {
if(!shouldPermit) 
{ 
  console.log("why I got printed forEach newlySelectedUsers");
  shouldPermit = true; <--- Moved from success function                  
  userService.getModelData($scope.$root.test[value].id) <--- Async Call
  .success(function (data) {                                
    if(lodash.isEmpty(data)) 
    {                                      
        $scope.insertSaving();
     }
     });                           
     }                      
   });
Другие вопросы по тегам