Вызов службы внутри цикла не останавливает цикл, даже если условие ложно
Я хочу прекратить повторный звонок 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();
}
});
}
});