À l'aide de succès/erreur/enfin/catch avec des Promesses en AngularJS
Je suis en utilisant $http
dans AngularJs, et je ne suis pas sûr sur la façon d'utiliser le retour de la promesse et de gérer les erreurs.
J'ai ce code:
$http
.get(url)
.success(function(data) {
//Handle data
})
.error(function(data, status) {
//Handle HTTP error
})
.finally(function() {
//Execute logic independent of success/error
})
.catch(function(error) {
//Catch and handle exceptions from success/error/finally functions
});
Est-ce une bonne façon de le faire, ou est-il un moyen plus facile?
Vous devez vous connecter pour publier un commentaire.
Promesses sont une abstraction au-dessus des déclarations qui nous permettent de nous exprimer de façon synchrone avec le code asynchrone. Ils représentent une exécution d'une tâche de temps.
Ils fournissent également de la gestion des exceptions, comme les code, vous pouvez le retourner à partir d'une promesse ou vous pouvez le jeter.
Ce que vous voulez dans le code synchrone est:
La promisified version est très similaire:
success()
,error()
etfinally()
combiné aveccatch()
? Ou dois-je utiliserthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);
success
eterror
(préférez.then
et.catch
au lieu de cela, vous pouvez (et devriez) omettre leerrorFunction
de la.then
utiliser un ccatch
comme dans mon code ci-dessus).success
/error
? Aussi mon Eclipse fonctionne amok lorsqu'il voit le.catch(
, donc j'utilise["catch"](
pour l'instant. Comment apprivoiser Eclipse?.success
et.error
, $http renvoie un $q promesse les plus de lasuccess
eterror
gestionnaires - toutefois, ces gestionnaires ne sont pas de la chaîne et doit généralement être évitée si possible. En général, si vous avez des questions, il est préférable de leur demander une nouvelle question et non pas comme un commentaire sur une ancienne..success
et.error
. Je suppose que cette réponse le couvre, mais quand même...Oublier d'utiliser
success
eterror
méthode.Les deux méthodes ont été dépréciés dans angulaire 1.4. Fondamentalement, la raison derrière l'autodérision, c'est qu'ils ne sont pas chainable-friendly, pour ainsi dire.
Avec l'exemple suivant, je vais essayer de démontrer ce que je veux dire,
success
eterror
n'étant pas chainable-friendly. Supposons que nous appelons une API qui retourne un objet utilisateur avec une adresse:De l'utilisateur de l'objet:
Appel à l'API:
Ce qui s'est passé?
Parce que
success
eterror
retour de la promesse d'origine, c'est à dire celui retourné par$http.get
, l'objet passé à la fonction de rappel de lathen
est l'ensemble de la utilisateur objet, c'est-à-dire la même entrée à la précédentesuccess
de rappel.Si l'on avait enchaîné deux
then
, cela aurait été moins à confusion:success
eterror
sont seulement ajouté à la restitution immédiate de la$http
appel (pas de prototype), donc, si vous appelez d'une autre promesse de méthode entre eux (comme, vous appelez normalementreturn $http.get(url)
enveloppé dans une bibliothèque de base, mais plus tard décider de basculer d'un spinner dans l'appel de la bibliothèque avecreturn $http.get(url).finally(...)
), alors vous n'aurez plus à ceux des méthodes pratiques.Je pense que les réponses précédentes sont correctes, mais voici un autre exemple (juste un f.y.j', success() et error() est déprécié selon AngularJS Page principale:
Ce type de granularité cherchez-vous? Vous pouvez généralement obtenir en avec:
J'ai trouvé que "enfin" et "catch" sont mieux quand le chaînage de plusieurs promesses.
loading = false
).catch()
MéthodeAngulaire $http cas, la réussite() et error() la fonction y aura objet response été descellés, afin que le rappel de la signature serait comme $http(...).succès(function(data, le statut, les en-têtes de config))
pour l'époque(), vous n'aurez probablement faire face à la crue de la réponse de l'objet.
comme posté dans AngularJS $http-API document
La dernière .catch(...) n'auront pas besoin, sauf si il y a une nouvelle erreur de jeter dans promesse de la chaîne.
Je ne l'aime Bradley Braithwaite suggère dans son blog:
Il est tout à fait stable et sûr, et si vous avez d'autres conditions de rejeter la promesse, vous pouvez toujours filtrer vos données dans la réussite de la fonction et l'appel
deferred.reject(anotherReason)
la raison du rejet.Comme Ryan Vice suggéré dans les commentaires, cela peut ne pas être considéré comme utile, sauf si vous tripoter un peu de la réponse, pour ainsi dire.
Parce que
success
eterror
sont dépréciées depuis la 1.4 c'est peut-être mieux pour l'utilisation de l'promesse méthodesthen
etcatch
et de transformer la réponse à l'intérieur de ces méthodes et le retour de la promesse de la transformée de réponse.Je suis en train de montrer le même exemple avec les deux approches, et un troisième entre approche:
success
eterror
approche (success
eterror
retour d'une promesse d'une réponse HTTP, donc nous avons besoin de l'aide de$q
de retour d'une promesse de données):then
etcatch
approche (c'est un peu plus difficile à tester, en raison de la jeter):Il y a une solution intermédiaire si, de cette façon, vous pouvez éviter la
throw
et de toute façon, vous aurez probablement besoin d'utiliser$q
pour se moquer de la promesse de comportement dans vos tests):Toute sorte de commentaires ou corrections sont les bienvenues.
success()
eterror()
ne reviendra pas, une nouvelle promesse quethen()
n'. Avec$q
nous rendre à notre usine de retour d'une promesse de données au lieu d'une promesse d'une réponse HTTP.function search(query) { return $http.get('http://localhost/v1?=q' + query) }