Запуск обработчика ошибок для Promise in Angular
Я работаю с $q в Angular и пытаюсь объединить некоторые обещания так, чтобы я выполнял действие только после успешного выполнения всех моих обещаний. Тем не менее, если какой-либо из них потерпит неудачу, я хочу избежать выполнения этого действия. В качестве примера:
function getData() {
return $http.get('url').then(
function(goodResponse) {
//do stuff
},
function(badResponse) {
return $q.reject("getData failed");
}
}
function firstPromise() {
return getData().then(
function() {
//got the data
},
function(error) {
return $q.reject(new BespokeErrorObject({message: error}));
}
);
}
function performAllPromises() {
// Has access to $q
$q.all(firstPromise(), ... ).then(
function() {
// All my Promises were fulfilled successfully
console.log("All good");
},
function(error) {
// Any one of them failed. Bail.
console.log(error.message);
}
}
В моем приложении (которое немного больше, чем в этом примере), я получаю All good
вывод, а не содержание выдаваемой ошибки, чего я не ожидаю, основываясь на моем понимании документации. Я использую all
неправильно?
Обновление: обновлено для использования $q.reject
как предложил Никос, и добавил дополнительный слой, как в реальном коде.
2 ответа
Выпуск PEBCAK. Оскорбительная строка
$q.all(firstPromise(), ... ).then(
который должен быть
$q.all([firstPromise(), ...]).then(
Тонкое, но очень важное отличие.
Отклонить обещание от любого then
обратный звонок, вы должны return $q.reject(xxx)
,
В твоем случае:
function getData() {
return $http.get('url').then(
function(goodResponse) {
//do stuff
},
function(badResponse) {
return $q.reject("getData failed");
}
}