J'essaie d'obtenir un descripteur sur le service Angular $q
, Ses objets et ses API associés. Lorsque je regarde les objets de ma console, je vois:
var deferred = $q.defer()
...(and then from console inspection)...
$q: Object {defer: function, reject: function, when: function, all: function}
deferred: Object {resolve: function, reject: function, notify: function, promise: Object}
deferred.promise: Object {then: function, catch: function, finally: function}
Cela soulève quelques questions:
$q.reject()
et deferred.reject()
? Quand utiliser chacun?errorFn
dans deferred.promise.then(successFn, errorFn)
et le catchFn
dans deferred.promise.catch(catchFn)
?catch()
sera-t-elle toujours appelée? Et si une des promesses imbriquées avait également une fonction de capture définie? Cette prise empêchera-t-elle l'exécution de la capture la plus extérieure?Merci.
1) $q.reject()
est un raccourci pour créer un différé et le rejeter immédiatement; J'utilise souvent cela dans un errorFn si je ne peux pas gérer l'erreur.
2) Rien, promise.catch(errorFn)
n'est qu'un sucre syntaxique pour promise.then(null, errorFn)
, tout comme les méthodes de réussite et d'erreur de la méthode $http
service, vous pouvez donc écrire le code suivant:
promise.
then(function(result){
// handle success
return result;
}, function errorHandler1(error){
// handle error, exactly as if this was a separate catch in the chain.
}).catch(function errorHandler2(error){
// handle errors from errorHandler1
});
3) C’est exactement là où $ q.reject peut être utile:
promise.
catch(function(error){
//Decide you can't handle the error
return $q.reject(error); //This forwards the error to the next error handler;
}).catch(function(error){
// Here you may handle the error or reject it again.
return 'An error occurred';
//Now other errorFn in the promise chain won't be called,
// but the successFn calls will.
}).catch(function(error){
// This will never be called because the previous catch handles all errors.
}).then(function(result){
//This will always be called with either the result of promise if it was successful, or
//'An error occured' if it wasn't
});
Ok c'est ma prise de promesses.
$q.reject(reason)
renvoie une promesse rejetée avec la raison passée en argument et différée. Rejeter rejette un différé existant, que son processus soit terminé ou non.
errorFn
est lancé quand une promesse est rejetée et son argument est la raison pour laquelle elle a été rejetée. Catch est appelé lorsqu'une erreur dans le processus de promesse n'a pas été gérée correctement, ce qui a provoqué une levée et une exception de la promesse et qui n'a été ni rejetée ni remplie.
Vous ne devriez pas avoir de promesses imbriquées, vous devriez avoir des promesses chaînées, auquel cas le dernier bloc catch devrait tout capturer avant si aucun autre bloc n'était spécifié pour le gérer.