comment briser la chaîne de promesses
Je une promesse dans un tel mode,
function getMode(){
var deferred = Promise.defer();
checkIf('A')
.then(function(bool){
if(bool){
deferred.resolve('A');
}else{
return checkIf('B');
}
}).then(function(bool){
if(bool){
deferred.resolve('B');
}else{
return checkIf('C');
}
}).then(function(bool){
if(bool){
deferred.resolve('C');
}else{
deferred.reject();
}
});
return deferred.promise;
}
checkIf
retourne une promesse, et oui checkIf
ne peut pas être modifié.
Comment puis-je sortir de la chaîne lors du premier match? (toute autre manière que celle explicitement jeter erreur?)
source d'informationauteur mido
Vous devez vous connecter pour publier un commentaire.
Je pense que vous ne voulez pas d'une chaîne. Dans un mode synchrone, vous auriez écrit
et c'est comment il devrait être traduit de promesses:
Il n'y a pas de
if else
-aplatissement de promesses.Vous pouvez avoir besoin de jeter quelque chose, mais il n'a pas à être une erreur.
La plupart promesse implémentations des méthodes
catch
accepter le premier argument comme type d'erreur (mais pas tous, et pas ES6 promesse), il serait utile dans cette situation:- Je ajouter de la capacité à briser dans la mise en œuvre récente de ma propre promesse de la bibliothèque. Et si vous utilisiez ThenFail (comme vous le feriez probablement pas), vous pouvez écrire quelque chose comme ceci:
Je voudrais juste utiliser coroutines/fraiece qui conduit à beaucoup plus simple de code:
Si vous n'avez pas de générateurs puis, il y a toujours traceur ou 6to5.
Vous pouvez utiliser
return { then: function() {} };
L'instruction return renvoie une "mesure", seulement, que la méthode ne fait rien.
Lorsqu'il est retourné à partir d'une fonction à l'époque(), alors() va essayer d'obtenir le résultat de la thenable.
La mesure de l' "puis" prend un rappel, mais qui ne sera jamais appelé dans ce cas. Ainsi, le "puis()" retourne, et le rappel pour le reste de la chaîne ne se produise pas.
j'aime beaucoup les réponses postées jusqu'à présent que d'atténuer ce que le q readme appelle la "pyramide de la mort". pour l'amour de la discussion, je vais ajouter le modèle que j'ai plantaient avant de chercher autour pour voir ce que les autres font. j'ai écrit une fonction comme
et j'ai fait quelque chose de totalement analogue à @vilicvane réponse, à l'exception plutôt que
throw new BreakSignal()
j'avais écritreturn null
et enveloppé de tous les.then
rappels dansnull_wrap
commeje pense que c'est une bonne réponse b/c il évite beaucoup d'indentation et b/c, l'OP a demandé spécifiquement pour une solution qui n'est pas
throw
. cela dit, je peut revenir en arrière et utiliser quelque chose de plus comme ce que @vilicvane n'b/c, certains de la bibliothèque de promesses pourrait revenirnull
pour indiquer autre chose que de "briser la chaîne", et qui pourrait être source de confusion.c'est plus un appel pour plus de commentaires/réponses que "c'est certainement la façon de le faire" réponse.
Venant probablement la fin de la partie ici, mais j'ai récemment posté une réponse à l'aide de générateurs et de la
co
bibliothèque qui permettrait de répondre à cette question (voir la solution 2):Le code serait quelque chose comme:
Vous serait assez bien écrire du code synchrone qui serait en réalité asynchrone !
Espère que cela aide!