Mettre à jour:
Pour aider les futurs téléspectateurs de cet article, j'ai créé cette démo de la réponse de pluma .
Question:
Mon objectif semble assez simple.
step(1)
.then(function() {
return step(2);
}, function() {
stepError(1);
return $q.reject();
})
.then(function() {
}, function() {
stepError(2);
});
function step(n) {
var deferred = $q.defer();
//fail on step 1
(n === 1) ? deferred.reject() : deferred.resolve();
return deferred.promise;
}
function stepError(n) {
console.log(n);
}
Le problème ici est que si j'échoue à l'étape 1, les deux stepError(1)
AND stepError(2)
sont déclenchés. Si je ne return $q.reject
puis stepError(2)
ne sera pas tiré, mais step(2)
sera, ce que je comprends. J'ai tout accompli sauf ce que j'essaye de faire.
Comment écrire des promesses pour pouvoir appeler une fonction en cas de rejet, sans appeler toutes les fonctions de la chaîne d'erreur? Ou y a-t-il une autre façon d'accomplir cela?
Voici une démo en direct pour que vous puissiez travailler avec quelque chose.
Mettre à jour:
J'ai en quelque sorte résolu le problème. Ici, j'attrape l'erreur à la fin de la chaîne et reject(data)
je transmets les données à afin de savoir quel problème gérer dans la fonction d'erreur. Cela ne répond pas à mes besoins car je ne veux pas dépendre des données. Ce serait nul, mais dans mon cas, il serait plus propre de transmettre un rappel d'erreur à la fonction plutôt que de dépendre des données renvoyées pour déterminer ce qu'il faut faire.
step(1)
.then(function() {
return step(2);
})
.then(function() {
return step(3);
})
.then(false,
function(x) {
stepError(x);
}
);
function step(n) {
console.log('Step '+n);
var deferred = $q.defer();
(n === 1) ? deferred.reject(n) : deferred.resolve(n);
return deferred.promise;
}
function stepError(n) {
console.log('Error '+n);
}
Promise.prototype.catch()
Les exemples sur MDN montrent la solution pour les mêmes problèmes.