Estoy tratando de escribir una función que devuelva una promesa. Pero hay momentos en que la información solicitada está disponible de inmediato. Quiero envolverlo en una promesa para que el consumidor no tenga que tomar una decisión.
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});
}
}
Y úsalo así:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
El problema es que la devolución de llamada no se ejecuta para la promesa resuelta previamente. ¿Es esto algo legítimo? ¿Hay una mejor manera de manejar esta situación?
return $q.when(Cache[id])
. De todos modos, esto debería funcionar y llamar a la devolución de llamada cada vez, ya que está creando nuevas promesas cada vez.Respuestas:
Respuesta corta: Sí, puede resolver una promesa de AngularJS antes de devolverla, y se comportará como es de esperar.
Desde Plunkr de JB Nizet pero refactorizado para trabajar dentro del contexto de lo que se solicitó originalmente (es decir, una llamada de función al servicio) y realmente en el sitio.
Dentro del servicio ...
Dentro del controlador ...
Espero que esto ayude a alguien. No encontré las otras respuestas muy claras.
fuente
Cómo simplemente devolver una promesa resuelta previamente en Angular 1.x
Promesa resuelta:
Promesa rechazada:
fuente
{resolved: $q.when, rejected: $q.reject}
Así es como lo hago normalmente si realmente quiero almacenar en caché los datos en una matriz u objeto
DEMO
fuente
Olvidó inicializar el elemento Caché
fuente
Cache
promesas en lugar de los objetos deseados y el tipo de retorno para los casos en que un objeto está en la caché y cuando no lo está, no será el mismo. Esto es más correcto, creo:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
Me gusta usar una fábrica para obtener datos de mi recurso.
Luego exponga mi modelo en el servicio como este aquí
Luego, mis controladores pueden incluirlo y exponerlo o hacer lo que parece correcto en su contexto simplemente haciendo referencia al Servicio inyectado.
Parece funcionar bien. Pero soy un poco nuevo en angular. * el manejo de errores se omitió principalmente para mayor claridad
fuente
getStuff
método está utilizando el antipatrón diferido