J'utilise $http
dans AngularJs, et je ne sais pas comment utiliser la promesse retournée et 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 existe-t-il un moyen plus simple?
success()
,error()
etfinally()
combiné aveccatch()
? Ou dois-je utiliserthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);
success
eterror
(préférez.then
et à la.catch
place, vous pouvez (et devriez) omettreerrorFunction
l'.then
utilisation accatch
comme dans mon code ci-dessus).success
/error
? De plus, mon Eclipse est folle quand il voit le.catch(
, donc je l'utilise["catch"](
pour le moment. Comment apprivoiser Eclipse?.success
et.error
, $ http renvoie une promesse $ q avec l'ajout des gestionnairessuccess
eterror
- cependant, ces gestionnaires ne s'enchaînent pas et devraient généralement être évités si / lorsque cela est possible. En général, si vous avez des questions, il est préférable de les poser comme une nouvelle question et non comme un commentaire sur une ancienne.Oubliez l'utilisation
success
et laerror
méthode.Les deux méthodes ont été déconseillées dans angular 1.4. Fondamentalement, la raison de la dépréciation est qu'ils ne sont pas compatibles avec les chaînes , pour ainsi dire.
Avec l'exemple suivant, je vais essayer de montrer ce que je veux dire
success
eterror
ne pas être enchaîné . Supposons que nous appelions une API qui renvoie un objet utilisateur avec une adresse:Objet utilisateur:
Appel à l'API:
Qu'est-il arrivé?
Car
success
eterror
retourne la promesse d'origine , c'est-à-dire celle renvoyée par$http.get
, l'objet passé au callback duthen
est tout l' objet utilisateur , c'est-à-dire la même entrée ausuccess
callback précédent .Si nous en avions enchaîné deux
then
, cela aurait été moins déroutant:la source
success
et neerror
sont ajoutés qu'au retour immédiat de l'$http
appel (pas au prototype), donc si vous appelez une autre méthode de promesse entre eux (comme, vous appelez normalementreturn $http.get(url)
enveloppé dans une bibliothèque de base, mais décidez plus tard de basculer un spinner dans l'appel de la bibliothèque avecreturn $http.get(url).finally(...)
), vous n'aurez plus ces méthodes pratiques.Je pense que les réponses précédentes sont correctes, mais voici un autre exemple (juste un fyi, success () et error () sont obsolètes selon la page principale d' AngularJS :
la source
Quel type de granularité recherchez-vous? Vous pouvez généralement vous en tirer avec:
J'ai trouvé que «enfin» et «attraper» sont mieux lotis pour enchaîner plusieurs promesses.
la source
loading = false
).catch()
méthodeDans le cas de Angular $ http, les fonctions success () et error () auront l'objet de réponse déroulé, donc la signature de rappel serait comme $ http (...). Success (function (data, status, headers, config))
pour then (), vous vous occuperez probablement de l'objet de réponse brut. tel que publié dans le document d'API AngularJS $ http
Le dernier .catch (...) ne sera pas nécessaire à moins qu'il y ait une nouvelle erreur rejetée dans la chaîne de promesse précédente.
la source
Je le fais comme le suggère Bradley Braithwaite dans son blog :
C'est assez stable et sûr et si vous avez d'autres conditions pour rejeter la promesse, vous pouvez toujours filtrer vos données dans la fonction de réussite et appeler
deferred.reject(anotherReason)
avec la raison du rejet.Comme Ryan Vice l'a suggéré dans les commentaires , cela peut ne pas être considéré comme utile à moins que vous ne manipuliez un peu la réponse, pour ainsi dire.
Parce que
success
eterror
sont obsolètes depuis la version 1.4, il est peut-être préférable d'utiliser les méthodes de promesse régulièresthen
etcatch
et transformer la réponse dans ces méthodes et retourner la promesse de cette réponse transformée.Je montre le même exemple avec les deux approches et une troisième approche intermédiaire:
success
eterror
approche (success
eterror
retourne une promesse de réponse HTTP, nous avons donc besoin de l'aide de$q
pour renvoyer une promesse de données):then
etcatch
approche (c'est un peu plus difficile à tester, à cause du lancer):Il existe cependant une solution à mi-chemin (de cette façon, vous pouvez éviter
throw
et de toute façon vous devrez probablement l'utiliser$q
pour vous moquer du comportement de promesse dans vos tests):Tout type de commentaire ou de correction est le bienvenu.
la source
success()
eterror()
ne renverrait pas une nouvelle promesse comme lethen()
fait. Avec$q
nous faisons notre usine pour renvoyer une promesse de données au lieu d'une promesse d'une réponse HTTP.