В Angular, какова концептуальная разница между ошибками и функциями catch для promises?

Наконец-то я получил Angular обработку ошибок обещания, но для меня это было интуитивно понятным. Я ожидал, что ошибки будут обработаны обратным вызовом отказа, но вместо этого мне пришлось использовать catch.

Я не совсем понимаю концептуально, почему выполняется catch, а не обратный вызов отказа.

Что я ожидал:

SomeAsyncService.getData().then(function (result) {
    // The call is successful.
    // Code in this block throws an error.
}, function (error) {
    // I expected to handle errors here.
});

Что в итоге сработало.

SomeAsyncService.getData().then(function (result) {
    // The call is successful.
    // Code in this block throws an error.
}).catch(function (error) {
    // Where the error is actually caught. 
});

Если есть более подходящий способ обработки обещаний, сообщите мне.

Ответы

Ответ 1

Второй аргумент почти никогда не будет использоваться буквально в коде приложения, а также использовать первый. В основном это связано с совместимостью библиотечной совместимости между различными реализациями.

Вы всегда должны использовать .catch, если у вас нет какого-то странного углового случая, где вам нужно .then(succcess, fail).

См. Анти-шаблон .then(success, fail).

Также библиотека Q (на основе angular $q) имеет аналогичный раздел в своем readme

Ответ 2

Я думаю, вы слегка недопонимаете, как работают promises.

В вашем первом блоке кода есть только один объект-обещание, а SomeAsyncService.getData(). ErrorCallback здесь не вызывается, потому что это обещание разрешено.

Во втором блоке кода есть фактически 2 объекта обещания, с которыми вы работаете. Обратите внимание, что .then() "возвращает новое обещание, которое разрешено или отклонено с помощью возвращаемого значения successCallback, errorCallback". Итак, что происходит, вы поймаете ошибку из второго обещания, полученного от SomeAsyncService.getData().then(...).

Ответ 3

По угловому_S документации для $q:

Методы

затем (successCallback, errorCallback, notifyCallback) - независимо от когда обещание было или будет разрешено или отклонено, затем называет одно успешных или ошибочных обратных вызовов асинхронно, как только результат доступен.

.....

catch (errorCallback) - сокращенное обозначение для обещания. then (null, errorCallback)

Два фрагмента кода, которые вы опубликовали, идентичны.