Подтвердить что ты не робот

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? Будет ли этот улов предотвращать выполнение самого внешнего улова?

Спасибо.

4b9b3361

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