gpt4 book ai didi

javascript - AngularJS:避免在收到响应之前两次调用相同的 REST 服务

转载 作者:数据小太阳 更新时间:2023-10-29 04:03:02 26 4
gpt4 key购买 nike

我有两个指令,每个都使用同一个工厂包装 $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 服务,因为当 ItemA 的 GET 进行时,ItemA 的 GET 仍在进行中。

有没有办法让第二个触发的那个知道已经有一个请求正在进行中,以便它可以等一分钟并免费获取它?

我考虑过制作一个 $http 或 $q 包装器,将每个 URL 标记为待处理或未处理,但我不确定这是最好的方法。如果挂起我该怎么办?只需返回现有的 promise ,它就会在另一个解决时解决?

最佳答案

是的,您需要做的就是缓存 promise 并在请求完成后将其清除。中间的任何后续请求都可以使用相同的 promise 。

angular.module("demo").factory("restService", ["$http", "$q", function($http, $q) {
var _cache;
return {
get: function() {
//If a call is already going on just return the same promise, else make the call and set the promise to _cache
return _cache || _cache = $http.get("whatever.json", {
cache: true
}).then(function(response) {
// do some stuff here
return response.data;
}).catch(function(response) {
return $q.reject(response.data);
}).finally(function(){
_cache = null; //Just remove it here
});
}
};
}]);

关于javascript - AngularJS:避免在收到响应之前两次调用相同的 REST 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com