web-dev-qa-db-fra.com

Angular $ q.reject () vs deferred.reject ()

J'essaie d'obtenir un descripteur sur le service Angular $q, Ses objets et ses API associés. Lorsque je regarde les objets de ma console, je vois:

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}

Cela soulève quelques questions:

  1. Quelle est la différence entre $q.reject() et deferred.reject()? Quand utiliser chacun?
  2. Quelle est la relation entre le errorFn dans deferred.promise.then(successFn, errorFn) et le catchFn dans deferred.promise.catch(catchFn)?
  3. Si j'ai un tas de promesses imbriquées et qu'une erreur se produit, la fonction la plus externe catch() sera-t-elle toujours appelée? Et si une des promesses imbriquées avait également une fonction de capture définie? Cette prise empêchera-t-elle l'exécution de la capture la plus extérieure?

Merci.

63
lostdorje

1) $q.reject() est un raccourci pour créer un différé et le rejeter immédiatement; J'utilise souvent cela dans un errorFn si je ne peux pas gérer l'erreur.

2) Rien, promise.catch(errorFn) n'est qu'un sucre syntaxique pour promise.then(null, errorFn), tout comme les méthodes de réussite et d'erreur de la méthode $http service, vous pouvez donc écrire le code suivant:

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) C’est exactement là où $ q.reject peut être utile:

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
    });
94
dustyrockpyle

Ok c'est ma prise de promesses.

  1. $q.reject(reason) renvoie une promesse rejetée avec la raison passée en argument et différée. Rejeter rejette un différé existant, que son processus soit terminé ou non.

  2. errorFn est lancé quand une promesse est rejetée et son argument est la raison pour laquelle elle a été rejetée. Catch est appelé lorsqu'une erreur dans le processus de promesse n'a pas été gérée correctement, ce qui a provoqué une levée et une exception de la promesse et qui n'a été ni rejetée ni remplie.

  3. Vous ne devriez pas avoir de promesses imbriquées, vous devriez avoir des promesses chaînées, auquel cas le dernier bloc catch devrait tout capturer avant si aucun autre bloc n'était spécifié pour le gérer.

5
Dayan Moreno Leon