J'essaye d'écrire une fonction qui renvoie une promesse. Mais il y a des moments où les informations demandées sont disponibles immédiatement. Je veux l'envelopper dans une promesse pour que le consommateur n'ait pas besoin de prendre une décision.
function getSomething(id) {
if (Cache[id]) {
var deferred = $q.defer();
deferred.resolve(Cache[id]); // <-- Can I do this?
return deferred.promise;
} else {
return $http.get('/someUrl', {id:id});
}
}
Et utilisez-le comme ceci:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
Le problème est que le rappel ne s'exécute pas pour la promesse pré-résolue. Est-ce une chose légitime à faire? Existe-t-il une meilleure façon de gérer cette situation?
return $q.when(Cache[id])
. Quoi qu'il en soit, cela devrait fonctionner et appeler le rappel à chaque fois puisque vous créez de nouvelles promesses à chaque fois.Réponses:
Réponse courte: Oui, vous pouvez résoudre une promesse AngularJS avant de la renvoyer, et elle se comportera comme prévu.
De Plunkr de JB Nizet mais remanié pour fonctionner dans le contexte de ce qui était initialement demandé (c'est-à-dire un appel de fonction au service) et effectivement sur site.
À l'intérieur du service ...
À l'intérieur du contrôleur ...
J'espère que cela aide quelqu'un. Je n'ai pas trouvé les autres réponses très claires.
la source
Comment renvoyer simplement une promesse pré-résolue dans Angular 1.x
Promesse résolue:
Promesse rejetée:
la source
{resolved: $q.when, rejected: $q.reject}
Voici comment je le fais généralement si je veux mettre en cache des données dans un tableau ou un objet
DEMO
la source
Vous avez oublié d'initialiser l'élément Cache
la source
Cache
avec des promesses au lieu des objets prévus et le type de retour pour les cas où un objet est dans le cache et quand il ne l'est pas ne sera pas le même. C'est plus correct, je pense:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
J'aime utiliser une usine pour obtenir les données de ma ressource quelque chose comme.
Ensuite, exposez mon modèle dans le service comme celui-ci ici
Ensuite, mes contrôleurs peuvent l'inclure et l'exposer ou faire ce qu'il pense être juste dans son contexte simplement en référençant le service injecté.
Semble fonctionner bien. Mais je suis un peu nouveau dans angular. * la gestion des erreurs est généralement laissée de côté pour plus de clarté
la source
getStuff
méthode utilise l'