AngularJS service de réessayer quand la promesse est rejetée
Je suis l'obtention de données à partir d'un service async à l'intérieur de mon contrôleur comme ceci:
myApp.controller('myController', ['$scope', 'AsyncService',
function($scope, AsyncService) {
$scope.getData = function(query) {
return AsyncService.query(query).then(function(response) {
//Got success response, return promise
return response;
}, function(reason) {
//Got error, query again in one second
//???
});
}
}]);
Mes questions:
- Comment interroger à nouveau le service, lorsque je reçois l'erreur de service sans retour à la promesse.
- Serait-il mieux de le faire dans mon service?
Merci!
Oui, re-le-feu dans le service, de cette façon dans le contrôleur, vous pouvez tout simplement avoir l'résolu de données.
définir votre fonction et le nom de quelque chose. En rejet d'appel. Aussi simple que cela!
essayé de retourner $champ d'application.getData(requête) dans le contrôleur, mais la promesse n'est plus envoyé
définir votre fonction et le nom de quelque chose. En rejet d'appel. Aussi simple que cela!
essayé de retourner $champ d'application.getData(requête) dans le contrôleur, mais la promesse n'est plus envoyé
OriginalL'auteur Angelin | 2013-10-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez réessayer la demande dans le service lui-même, pas le contrôleur.
Donc,
AsyncService.query
peut être quelque chose comme:Et vous pouvez vous débarrasser de votre fonction d'erreur dans le contrôleur:
mis à jour avec comptoir.
merci beaucoup pour ton exemple, il fonctionne comme un charme 😉
pour appeler vous-même un idiot
Quelques notes sur la mise en œuvre de l'intervalle exponentielle (2x délai après chaque échec): developers.google.com/analytics/devguides/reporting/core/v3/...
OriginalL'auteur M.K. Safi
Cela fonctionne:
Alors juste un exemple d'utilisation:
Vous avez besoin lors de la déclaration de votre module:
Et à vous de contrôleur:
Si quelqu'un veut améliorer un certain type de l'interruption ou de la fonction aléatoire pour réessayer la demande, que ce sera encore mieux. Je souhaite un jour quelque chose comme ça va être dans Angulaire de Base
Peut-être ne
results.reject(...)
de traiter correctement l'erreurDonc je l'ai essayé et il fonctionne très bien (rejeter après 3 erreurs)
OriginalL'auteur Dorian
J'ai écrit une mise en œuvre avec l'intervalle exponentielle qui ne veut pas utiliser la récursivité (ce qui serait créé imbriquée pile d'images, correct?) La façon dont il est mis en œuvre le coût de l'utilisation de plusieurs minuteries et il crée toujours toutes les frames de pile pour la make_single_xhr_call (même après la réussite, au lieu de seulement après l'échec). Je ne sais pas si ça vaut le coup (surtout si la moyenne des cas est un succès), mais c'est de la nourriture pour la pensée.
J'étais inquiet au sujet d'une condition de concurrence entre des appels, mais si javascript est monothread et n'a pas de changements de contexte (ce qui permettrait à un $http.le succès d'être interrompu par un autre et lui permettre d'exécuter deux fois), puis nous nous sommes bien ici, c'est exact?
Aussi, je suis très nouveau pour angularjs et moderne javascript pour que les conventions n'ont peut-être un peu sale aussi. Laissez-moi savoir ce que vous en pensez.
OriginalL'auteur mathewguest
J'ai fini par faire beaucoup alors j'ai écrit une bibliothèque pour aider à résoudre ce problème : )
https://www.npmjs.com/package/reattempt-promise-function
Dans cet exemple, vous pourriez faire quelque chose comme
OriginalL'auteur beckyconning