angularjs - not - Angular JS: problema de llamada de fábrica asíncrona
init angular js (1)
Soy nuevo en angular y estoy creando una aplicación simple. Navega entre proyectos, atraídos a través de JSON:
http://plnkr.co/edit/FTfa1rcVaf85xTu65oSR?p=preview
También estoy usando una fábrica, donde realizo una llamada como get
o getOne
, para que se getOne
$http
en un solo lugar, solo llamándolo si los datos no se han recuperado.
Todo esto funciona bien cuando comienzas en la página de inicio, pero cuando comienzas en una página de proyecto individual, se llama tanto a get
como a getOne
al mismo tiempo, extrayendo datos duplicados. Puede probar esto abriendo el Plunker en su propia ventana y dirigiéndose a una url como /#/projects/1
.
Sé por qué sucede esto, simplemente no puedo entender cómo detenerlo.
¿Hay una solución simple para esto o lo estoy haciendo de una manera completamente incorrecta?
Gracias por echar un vistazo.
Haga que sus funciones devuelvan promesas a través de $q
, en lugar de datos brutos. Luego podrá encadenarlos con .then()
para lograr la espera que necesita:
get: function() {
// Create a deferred object
var deferred = $q.defer();
// Do stuff in here
// ...
// and depending on the results,
// call deferred.resolve(data) or deferred.reject(error)
// Return the promise object
return deferred.promise;
}
Luego, en el código que llama a esta función, puede:
MyFactory.get().then(function (data) {
$scope.var = data;
}
Este patrón es bastante común en Angular y funciona bien.
Plunkr actualizado: aquí . Cambié la forma en que simulaba el retraso de solicitud del servidor para poder resolver fácilmente mi objeto deferred
en la devolución de llamada .success()
de $http
.