8
votes

Arrêter une chaîne de promesse angularjs

J'essaie de comprendre un bon moyen de dire "faites toutes ces choses, mais cautionnement dans l'affaire que l'un d'entre eux échoue"

Ce que j'ai maintenant: xxx

Ce que je veux finalement, c'est d'en quelque sorte attraper une erreur sur cette chaîne afin que je puisse transmettre à la report promesse ci-dessus. Je ne me soucie pas particulièrement si la syntaxe est tenue de semblable à ce que j'ai ci-dessus.

ou même si quelqu'un peut simplement me dire comment arrêter la chaîne ci-dessus.


3 commentaires

@ user2246674 - Rejeter ne semble pas arrêter la chaîne cependant, la suivante continue tout simplement


Je ne sais pas ce que je pensais ..


C'est un exemple horrible de différé AntiPattern ! Vis que reporter , juste retour le this.load (...) .Chen (a) .Ce (b) .Chen (d). ; chaîne!


6 Réponses :


0
votes

D'accord, cela fonctionne mais je n'aime pas ça ... En attente de quelque chose de mieux :)

Il semble juste sale de créer une promesse pour la seule des raisons de le rejeter immédiatement p>

myApp
    .factory( 'chainReject', [ '$q', function( $q ){
        return function( err ){
            var defer = $q.defer();
            defer.reject( err );

            return defer.promise;
        }
    } ] );

...

var defer = $q.defer();

this
    .load( thingy ) // returns a promise

    .then( this.doSomethingA.bind( this ), chainReject )
    .then( this.doSomethingB.bind( this ), chainReject )
    .then( this.doSomethingC.bind( this ), chainReject )
    .then( this.doSomethingD.bind( this ), chainReject )

    .then( defer.resolve.bind( defer, this ), defer.reject.bind( defer ) );
    ;

return defer.promise;


0 commentaires

0
votes

ressemble à ce cas d'utilisation a été anticipé et adressé avec l'utilisation de $ q.Reject (raison)


0 commentaires

2
votes

Vous devriez être capable de faire la même chose en: xxx


1 commentaires

Cette réponse utilise un anti-motif et amène l'utilisateur à répéter la manipulation des erreurs.



6
votes

Vous pouvez arrêter la chaîne angularjs en retournant une promesse rejetée à l'intérieur de tout rappel. XXX

DOA , DOB , Doc , dod peut avoir une logique comme ceci: xxx


3 commentaires

+1 Qu'est-ce que j'ai pour moi est la partie retour de retour $ q.Reject () . Beaucoup de recherches ont conduit à toutes sortes de façons différentes, mais de renvoyer réellement le $ q.Reject () au lieu de simplement appeler c'est ce qui tue la chaîne. Surtout si vous essayez de faire quelque chose qui n'est pas une défaillance HTTP, mais un «échec» dans le sens où le modèle est retourné avec une réponse négative attendue.


Une autre façon d'arrêter la chaîne, disons que vous souhaitez montrer des erreurs qui se sont produites lors de l'exécution de la chaîne, vous pouvez simplement lancer une nouvelle erreur ()


Le retour de la promesse rejetée ne cessera pas la chaîne.



3
votes

Je viens de tomber sur cela et je me suis rendu compte que toutes ces réponses sont terriblement obsolètes. Voici la bonne façon de gérer cela pour quiconque qui arrive à trouver ce message.

// Older code
return this.load(thing)
  .then(this.doA, $q.reject)
  .then(this.doB, $q.reject)
  .then(this.doC, $q.reject)
  .then(this.doD, $q.reject)
  .then(null, $q.reject);


// Updated code
// Returns the final promise with the success handlers and a unified error handler
return this.load(thing)
  .then(this.doA)
  .then(this.doB)
  .then(this.doC)
  .then(this.doD)
  .catch(this.handleErrors); // Alternatively, this can be left off if you just need to reject the promise since the promise is already rejected.
  // `.catch` is an alias for `.then(null, this.handleErrors);`


5 commentaires

.Catch n'existait pas dans l'angulaire $ Q lorsque cette question a été posée :)


@zyklus, vous êtes correct mais .Catch est juste un alias pour .then (null, fn) . Qui aurait dû être valide alors.


Il n'a pas été utilisé pour passer des erreurs à travers, c'est-à-dire que cela ne ferait que prendre des erreurs du précédent alors , c'est pourquoi j'ai écrit toute la chaîne rejet de non-sens ci-dessous.


Si tel était le cas, alors en utilisant $ q.Reject comme deuxième paramètre à chaque .Chen aurait été correct. Je laisserai ma réponse en tant que version mise à jour qui gère correctement les promesses alors que la réponse acceptée utilise toujours un anti-motif.


N'arrête pas la chaîne. Attrape retourne une promesse.



0
votes

Le meilleur moyen de gérer cela et également à attraper le problème est le bloc .catch. À l'intérieur de n'importe quel bloc que vous voulez tuer la chaîne de promesse, oui utiliser:

 .catch(function(err) {
     console.log(err); //This will log the above 'Error Message Here'
 });


0 commentaires