2016-08-05 3 views
2

Я работаю над контроллером 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 отлично работает на конечный результат, но мне нужны отдельные результаты всех услуг. Как я могу обрабатывать отдельные значения, а также обрабатывать конечный результат?

+0

Могут ли услуги работать параллельно? – str

+0

'$ q.all' или' Promise.all' могут запускать все эти обещания параллельно, а затем дать вам массив своих результатов. – ste2425

+0

Я предполагаю, что вы можете передать 2 обратных вызова к вашей тогда функции, которая является успешным и блокирует ошибку. Обе функции возвращают следующий объект обещания и сохраняют состояние отклоненного обещания в переменной таким образом, что выполнение не останавливается. – Nirus

ответ

7

Вы можете использовать $q.all ждать, пока все обещания:

var promises = [ 
    FirstService.getStatus(), 
    SecondService.getStatus(), 
    ThirdService.getStatus(), 
    FourthService.getStatus(), 
]; 

$q.all(promises) 
    .then(function (serviceResults) { 
     vm.serviceResults = serviceResults; // result of first promise will be available in vm.serviceResults[0] 
     vm.statusResult = serviceResults.every(function (serviceResult) { 
      return serviceResult; 
     }); 
    }) 
    .catch(function() { 
     vm.statusResult = false; 
    }); 
+0

Это выглядит очень хорошо, но у меня есть вопрос: если сервисы возвращают следующую последовательность:« true »,« true »,' false', 'true' не будет последним 'true' переопределить значение' false' из-за строки 'vm.statusResult = serviceResults.every (function (serviceResult) { return serviceResult; });'? – JohnDizzle

+1

serviceResults.every вернет false, если хотя бы один serviceResult является ложным. Таким образом, это не будет отменено. все значения должны возвращать true. –

+1

@JohnDizzle Нет, как писал oliv37. 'serviceResults' - это массив, содержащий все результаты от обещаний (например,' [true, true, false, true] '). И функция 'every' возвращает true только тогда, когда значение * every * истинно. – str

Смежные вопросы