Запуск обработчика ошибок для 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");
        }
}
Другие вопросы по тегам