Я работаю над контроллером AngularJS, который должен работать с несколькими обещаниями, возвращающими логическое значение. На основе этих булевых значений будет определено результирующее логическое значение. Если все возвращаемые значения равны true
, то результат будет true
, но даже если только одно обещание вернет false
, результат будет false
. В настоящее время все мои вызовы службы/DAO связаны цепями, что вызывает некоторые проблемы, если одно обещание отклонено. Я думаю, есть лучший способ справиться с этой ситуацией.AngularJS имеет дело с несколькими обещаниями
Controller Код:
app.controller('PromiseController', ['$scope', 'FirstService', 'SecondService', 'ThirdService',
'FourthService', function ($scope, FirstService, SecondService, ThirdService, FourthService) {
var vm = this;
vm.statusResult = false;
vm.statusSecond = null;
vm.statusThird = null;
vm.statusFourth = null;
vm.statusFirst = null;
SecondService.getStatus()
.then(function(returnData){
vm.statusSecond = returnData;
})
.then(function(){
return ThirdService.getStatus();
})
.then(function(returnData){
vm.statusThird = returnData;
})
.then(function(){
return FourthService.getStatus();
})
.then(function(returnData){
vm.statusFourth = returnData;
})
.then(function(){
return FirstService.getStatus();
})
.then(function(returnData){
vm.statusFirst = returnData;
})
.then(function(){
if(vm.statusThird&&vm.statusFourth&&vm.statusFirst&&vm.statusSecond){
vm.statusResult = true;
}
});
return this;
}]);
Так что я ищу лучший способ, как бороться с многочисленными обещаниями и как решить окончательный результат всех обещаний. Также приложение не должно зависать при обработке результатов.
EDIT
Раствор с $q.all
из @str отлично работает на конечный результат, но мне нужны отдельные результаты всех услуг. Как я могу обрабатывать отдельные значения, а также обрабатывать конечный результат?
Могут ли услуги работать параллельно? – str
'$ q.all' или' Promise.all' могут запускать все эти обещания параллельно, а затем дать вам массив своих результатов. – ste2425
Я предполагаю, что вы можете передать 2 обратных вызова к вашей тогда функции, которая является успешным и блокирует ошибку. Обе функции возвращают следующий объект обещания и сохраняют состояние отклоненного обещания в переменной таким образом, что выполнение не останавливается. – Nirus