http - navigationend - Usar Promesa y servicio juntos en Angular
router events subscribe angular 4 (2)
Es un poco costoso crear tu propia promesa, angular $ http crea una para ti de todos modos. Lo que está buscando es el almacenamiento en caché y http puede manejarlo por usted pasando caché: fiel a la llamada de servicio.
Así que simplemente puedes hacer algo como esto:
module.factory("userProvider", function() {
var getUser = function() {
return $http.get(..., {cache:true}).then(function(data) {
return data.user;
});
return {
getUser : getUser
}
});
Mi pregunta se basa en este tema en el grupo de Google Angular.
Quiero proporcionar un servicio que almacene algunos datos básicos recuperados del backend a través de $ http, luego solo necesito recuperar esos datos una vez. me gusta,
var load = function() {
return $http.get(...).then(function(data) {
return data.user;
});
};
module.factory("userProvider", function() {
var user;
var getUser = function() {
if(!user) {
load().then(function(data) {
user = data;
});
}
return user;
};
return {
getUser : getUser
}
});
module.controller("UserController", ["userProvider", function UserController("userProvider") {
var user = userProvider.getUser();
// do something with user
}]);
El problema es que la cadena de promesa finaliza en userProvider pero no en el controlador, por lo que el usuario no está definido la primera vez que uso este controlador, ya que los datos no se han devuelto.
¿Cómo puedo usar ese servicio de almacenamiento y devolver los datos correctamente? ¡Gracias!
Puedes crear tu propia promesa. Aquí está el código modificado:
module.factory( "userProvider", function( $q ) {
// A place to hold the user so we only need fetch it once.
var user;
function getUser() {
// If we''ve already cached it, return that one.
// But return a promise version so it''s consistent across invocations
if ( angular.isDefined( user ) ) return $q.when( user );
// Otherwise, let''s get it the first time and save it for later.
return whateverFunctionGetsTheUserTheFirstTime()
.then( function( data ) {
user = data;
return user;
});
};
// The public API
return {
getUser: getUser()
};
});
Actualización: La solución a continuación por @yohairosen es excelente para muchas circunstancias, pero no para todos. En algunas circunstancias, solo nos gustaría almacenar en caché el resultado exitoso , como lo he hecho aquí. Si, por ejemplo, una falla en esta solicitud indica que el usuario necesita iniciar sesión primero, no queremos que la próxima llamada (probablemente después de iniciar sesión) entregue la falla en caché. En los casos en que el método no es necesariamente consistente de llamada a llamada en todas las circunstancias, este método es mejor; en todos los demás casos, la solución de @ yohairosen es más simple y recomendable.