【发布时间】:2015-01-15 21:43:46
【问题描述】:
我有两个指令,每个都使用同一个工厂包装 $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);
});
}
};
}]);
问题:当我这样做时
<div item-a></div>
<div item-b></div>
我启动了两次相同的 Web 服务,因为当 ItemB 的 GET 执行时,来自 ItemA 的 GET 仍在进行中。
有没有办法让第二个触发者知道已经有一个正在进行的请求,以便它可以等待一分钟并免费获取它?
我考虑过制作一个 $http 或 $q 包装器,将每个 URL 标记为待处理或未处理,但我不确定这是最好的方法。如果它处于未决状态,我会怎么做?只需返回现有的承诺,当另一个解决时它会解决?
【问题讨论】:
-
也许您可以在控制器中调用一次服务并将对象传递给两个指令?
标签: javascript angularjs http asynchronous q