Estoy usando algunos datos que provienen de un servicio RESTful en varias páginas. Entonces estoy usando fábricas angulares para eso. Por lo tanto, necesitaba obtener los datos una vez del servidor y cada vez que obtengo los datos con ese servicio definido. Como una variable global. Aquí está la muestra:
var myApp = angular.module('myservices', []);
myApp.factory('myService', function($http) {
$http({method:"GET", url:"/my/url"}).success(function(result){
return result;
});
});
En mi controlador estoy usando este servicio como:
function myFunction($scope, myService) {
$scope.data = myService;
console.log("data.name"+$scope.data.name);
}
Está funcionando bien para mí según mis requisitos. Pero el problema aquí es que cuando vuelvo a cargar en mi página web, el servicio se llamará nuevamente y se solicitará el servidor. Si en el medio se ejecuta alguna otra función que depende del "servicio definido", está dando el error como "algo" no está definido. Entonces quiero esperar en mi script hasta que se cargue el servicio. ¿Cómo puedo hacer eso? ¿Hay de todos modos hacer eso en angularjs?
fuente
function myFunction($scope, myService) { var myDataPromise = myService.getData(); myDataPromise.then(function(result) { $scope.data = result; console.log("data.name"+$scope.data.name); }); console.log("This will get printed before data.name inside then. And I don't want that."); }
para las personas nuevas en esto, también puede usar una devolución de llamada, por ejemplo:
A tu servicio:
En tu controlador:
fuente
Para su información, esto está usando Angularfire, por lo que puede variar un poco para un servicio diferente u otro uso, pero debería resolver lo mismo que tiene $ http. Tenía este mismo problema, la única solución que se adaptaba mejor a mí era combinar todos los servicios / fábricas en una única promesa en el alcance. En cada ruta / vista que necesitaba que se carguen estos servicios / etc., coloco las funciones que requieren datos cargados dentro de la función del controlador, es decir, myfunct () y la aplicación principal.js en ejecución después de la autenticación que puse
y en la vista acabo de hacer
en el primer elemento / contenedor de vista principal para que el controlador pueda ejecutar todo lo que hay dentro
sin preocuparse por las promesas asincrónicas / pedidos / problemas de cola. Espero que eso ayude a alguien con los mismos problemas que yo tuve.
fuente
Estaba teniendo el mismo problema y ninguno si esto funcionó para mí. Sin embargo, esto es lo que funcionó ...
y luego la función que lo usa es ...
El servicio no es tan necesario, pero creo que es una buena práctica para la extensibilidad. La mayor parte de lo que necesitará para uno será para cualquier otro, especialmente cuando utilice API. De todos modos espero que esto haya sido útil.
fuente