tenter de rompre la chaîne de promesses jQuery avec .then, .fail et .reject
Mise à jour: ce problème a été une suite de jQuery 1.7 vs 1.8. N'employez jamais de promesses en 1.7, car ils ne sont pas chainable avec le retour d'une promesse à l'intérieur d'un .then
. 1.8 dirait qu'ils n'ont pas le louper.
http://jsfiddle.net/delvarworld/28TDM/
//make a promise
var deferred = $.Deferred();
promise = deferred.promise();
//return a promise, that after 1 second, is rejected
promise.then(function(){
var t = $.Deferred();
setTimeout(function() {
console.log('rejecting...');
t.reject();
}, 1000);
return t.promise();
});
//if that promise is successful, do this
promise.then(function() {
console.log('i should never be called');
})
//if it errors, do this
promise.fail(function() {
console.log('i should be called');
});
deferred.resolve();
Attendu: "je devrais être appelé"
Réel: "je ne devrait jamais être appelé"
Problème: je veux de la chaîne des rappels et l'un d'entre eux d'être en mesure de briser la chaîne et de déclencher la fail
fonction, puis passez à l'autre enchaînés rappels. Je ne comprends pas pourquoi tous les arrêtera sont déclenchées et l'échec n'est pas déclenché.
Je viens de NodeJS Q bibliothèque, j'ai donc essayé avec .then
premier. Cependant, le changer pour .pipe
n'a aucun effet.
source d'informationauteur Andy Ray
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas re-définition de la valeur de
promise
essayez ceci:http://jsfiddle.net/28TDM/1/
Apparemment, il ne travail de la façon dont vous pensiez qu'il n',
il n'est tout simplement pas documentéhttps://api.jquery.com/deferred.then. Très cool. C'est les nouvelles fonctionnalités de jQuery 1.8.0, plus que probablement, ils ne sont simplement pas fait la mise à jour de la documentation.À mon humble avis, vous n'êtes pas le chaînage de quoi que ce soit. Votre 2ème
.then
est attaché à la même promesse en tant que la première.then
est attaché à.Pourquoi?
Avis que,
then
toujours RETOUR la nouvelle promesse, plutôt que de changer la promesse qu'il soit attaché. Il n'a pas d'effet secondaire.Par exemple:
promiseA
ne change pas sa valeur après avoir été attachéthen
il va les garder est aussi.promiseX
sera la valeur de retour de la 1èrethen
qui est,promiseB
.Ainsi, le 2e
then
est réellement attaché àpromiseB
.Et c'est exactement ce que @Kevin B a fait dans sa réponse.
Une autre solution est, depuis
.then
sera de retour la nouvelle promesse, vous pouvez la chaîne de la.then
fonctions comme ci-dessous.Ce temps, le 1er
then
est attaché àpromiseA
et devinez à qui la promesse est la 2èmethen
être attachées?Vous avez raison. C'est
promiseB
paspromiseA
. Parce que le 2èmethen
est réellement attaché à la valeur de retour de la 1èrethen
c'est à dire,promiseB
.Et enfin la 2ème
then
le retour de valeur est affectée àpromiseX
doncpromiseX
est égal àpromiseC
.Ok, revenir à l'OP de la question. Le code suivant est ma réponse.