AngularJS: evite llamar al mismo servicio REST dos veces antes de recibir la respuesta
Tengo dos directivas, cada una de las cuales consume la misma fábrica que envuelve una llamada $ q / $ http.
angular.module("demo").directive("itemA", ["restService", function(restService) {
return {
restrict: "A",
link: function(scope, element, attrs) {
restService.get().then(function(response) {
// whatever
}, function(response) {
// whatever
});
}
};
}]);
angular.module("demo").directive("itemB", ["restService", function(restService) {
return {
restrict: "A",
link: function(scope, element, attrs) {
restService.get().then(function(response) {
// whatever
}, function(response) {
// whatever
});
}
};
}]);
angular.module("demo").factory("restService", ["$http", "$q", function($http, $q) {
return {
get: function() {
var dfd = $q.defer();
$http.get("whatever.json", {
cache: true
}).success(function(response) {
// do some stuff here
dfd.resolve(response);
}).error(function(response) {
// do some stuff here
dfd.reject(response);
});
}
};
}]);
Problema: cuando hago esto
<div item-a></div>
<div item-b></div>
Obtengo el mismo servicio web dos veces, porque el GET del ItemA todavía está en progreso cuando el GET para el ItemB desaparece.
¿Hay alguna forma de que, en cualquier momento que se dispare en segundo lugar, sepa que ya hay una solicitud en curso para que pueda esperar un minuto y obtenerla de forma gratuita?
He pensado en hacer un envoltorio $ http o $ q que marque cada URL como pendiente o no, pero no estoy seguro de que sea la mejor manera. ¿Qué haría si estuviera pendiente? ¿Simplemente devuelve la promesa existente y se resolverá cuando el otro resuelva?