В 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)
Два фрагмента кода, которые вы опубликовали, идентичны.