12 votes

Après la requête $http d'Angular.js, appeler la fonction complète indépendamment du succès ou de l'échec de la promesse.

Comment puis-je m'assurer que le complete() s'exécutera quel que soit le résultat de l'appel $http en utilisant l'API de promesse fournie avec Angular.js ?

$http({
    method: 'POST',
    url: submitUrl,
    data: $scope.data
})
.success(function(data) {
      // execute this code on success
})
.error(function(data) {
      // execute this code on error
})
.complete(function() {
  // execute this code regardless of outcome
});

On pourrait l'utiliser pour masquer l'icône d'un spinner AJAX une fois la requête terminée. Vous voudriez masquer l'icône de filtrage quel que soit le résultat de la demande.

18voto

Beetroot-Beetroot Points 12006

Je ne suis pas le plus grand expert au monde en Angular.js mais je crois comprendre que vous pouvez faire comme suit :

whatever.then(function() {
    // success code here
}, function() {
    // error code here
    return true; // return anything that's not undefined (and not a `throw()`) to force the chain down the success path at the following then().
}).then(function() {
    // "complete" code here
});

Vous êtes essentiellement obligés de créer quelque chose à partir d'un ou plusieurs .then() qui est la seule méthode d'une promesse de $q.

12voto

bernhardw Points 1053

Cela dépend de ce que vous souhaitez faire, mais pour la logique de nettoyage et autres, vous pouvez aussi utiliser finally() à exécuter soit sur l'accomplissement ou le rejet de votre promesse :

promise.finally(function () {
    // Do something regardless of outcome.
});

Veuillez noter que, bien que finally() est soutenu par $q (et quelques autres bibliothèques) ne fait pas partie de l'ensemble de la bibliothèque de l projet officiel .

8voto

wmluke Points 309

Si vous ne vous souciez pas de savoir si la requête est réussie ou non, alors vous pouvez passer la même callback à success y error ...

   var cb = function(response){
      // do something
   };

   $http.post(submitUrl, $scope.data).success(cb).error(cb);

   // OR

   $http.post(submitUrl, $scope.data).then(cb, cb);

Mais sachez que success y error ont une signature différente de celle des then les rappels.

De plus, les promesses sont reconnues par le moteur de création de modèles d'Angular, ce qui signifie que dans les modèles, vous pouvez traiter les promesses attachées à une portée comme si elles étaient les valeurs résultantes.

Cela signifie que vous pouvez le faire :

Contrôleur :

$scope.article = $http.get('/articles/' + articleId);

Modèle :

<article ng-cloak>
   <h3>{{article.title}}</h3>
   <div>{{article.content}}</div>
</article>

Et la vue sera mise à jour lorsque le $http.get a été résolue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X