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: p> Ce que je veux finalement, c'est d'en quelque sorte attraper une erreur sur cette chaîne afin que je puisse transmettre à la ou même si quelqu'un peut simplement me dire comment arrêter la chaîne ci-dessus. P> P> report code> promesse ci-dessus. Je ne me soucie pas particulièrement si la syntaxe est tenue de semblable à ce que j'ai ci-dessus. P>
6 Réponses :
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;
ressemble à ce cas d'utilisation a été anticipé et adressé avec l'utilisation de $ q.Reject (raison) p>
Vous devriez être capable de faire la même chose en:
Cette réponse utilise un anti-motif et amène l'utilisateur à répéter la manipulation des erreurs.
Vous pouvez arrêter la chaîne angularjs en retournant une promesse rejetée à l'intérieur de tout rappel. Où DOA EM>, DOB em>, Doc em>, dod em> peut avoir une logique comme ceci: p>
+1 Qu'est-ce que j'ai pour moi est la partie retour code> de
retour $ q.Reject () code>. 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 () code>
Le retour de la promesse rejetée ne cessera pas la chaîne.
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);`
.Catch code> n'existait pas dans l'angulaire
$ Q code> lorsque cette question a été posée :)
@zyklus, vous êtes correct mais .Catch code> est juste un alias pour
.then (null, fn) code>. 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 code>, 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 code> comme deuxième paramètre à chaque
.Chen code> 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.
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' });
@ 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 code>, juste
retour code> le
this.load (...) .Chen (a) .Ce (b) .Chen (d). ; code> chaîne!