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 должен улавливать все до того, как он не был обработан.