Angular $q.reject() vs deferred.reject()
Я пытаюсь получить дескриптор службы Angular $q
и связанных с ним объектов и API. Когда я смотрю на объекты в консоли, я вижу:
var deferred = $q.defer()
...(and then from console inspection)...
$q: Object {defer: function, reject: function, when: function, all: function}
deferred: Object {resolve: function, reject: function, notify: function, promise: Object}
deferred.promise: Object {then: function, catch: function, finally: function}
Возникает несколько вопросов:
- В чем разница между
$q.reject()
и deferred.reject()
? Когда использовать каждый?
- Какая связь между
errorFn
в deferred.promise.then(successFn, errorFn)
и catchFn
в deferred.promise.catch(catchFn)
?
- Если у меня есть куча вложенных promises и возникает ошибка, всегда будет вызываться самая внешняя функция
catch()
? Что, если одна из вложенных promises также имеет функцию catch? Будет ли этот улов предотвращать выполнение самого внешнего улова?
Спасибо.
Ответы
Ответ 1
1) $q.reject()
является ярлыком для создания отложенного и затем немедленно отклоняет его; Я часто использую это в errorFn, если не могу обработать ошибку.
2) Ничего, promise.catch(errorFn)
является просто синтаксическим сахаром для promise.then(null, errorFn)
, как и методы успеха и ошибки службы $http
, поэтому вы можете написать код следующим образом:
promise.
then(function(result){
// handle success
return result;
}, function errorHandler1(error){
// handle error, exactly as if this was a separate catch in the chain.
}).catch(function errorHandler2(error){
// handle errors from errorHandler1
});
3) Это именно то, где $q.reject может пригодиться:
promise.
catch(function(error){
//Decide you can't handle the error
return $q.reject(error); //This forwards the error to the next error handler;
}).catch(function(error){
// Here you may handle the error or reject it again.
return 'An error occurred';
//Now other errorFn in the promise chain won't be called,
// but the successFn calls will.
}).catch(function(error){
// This will never be called because the previous catch handles all errors.
}).then(function(result){
//This will always be called with either the result of promise if it was successful, or
//'An error occured' if it wasn't
});
Ответ 2
Хорошо, это мой запрос от promises.
-
$q.reject(reason)
возвращает отклоненное обещание с причиной, переданной в качестве аргумента и отложенной. Отклонение отклоняет существующую отсроченную, завершился ли ее процесс или нет.
-
errorFn
запускается, когда обещание отвергается, и его аргумент является причиной его отказа. Catch вызывается, когда ошибка внутри процесса обещания не обрабатывается должным образом, вызывая обещание поднять и исключить, а не быть отвергнутым или выполненным.
-
У вас нет вложенных promises, вы должны иметь цепочку promises, и в этом случае последний блок catch должен улавливать все до того, как он не был обработан.