我的控制器和服务具有缓存值。
app.service('nameService', ['$q','$http', function($q, $http){
var that = this;
that.name = null;
this.index = function(){
var deferred = $q.defer();
if (that.name !== null) {
// fired cahed value
console.log('cashed');
deferred.resolve(that.name);
} else {
$http.get('/api/name').success(
function(response) {
// fired request to server
console.log('server');
that.name = response.name;
deferred.resolve(that.name);
}
);
}
return deferred.promise;
}]);

当控制器中的请求发送时间间隔为
app.controller('nameCtr', ['$scope', '$timeout', 'nameService'],
function($scope, $timeout, nameService){
nameService.index(); // console.log server
$timeout(function(){
nameService.index(); // console.log cached
},3000)
$timeout(function(){
nameService.index(); // console.log cashed
},6000)
}]);

一切正常,首先请求被解雇server
,其他被解雇cached
。
但是如果我毫不拖延地发送请求,我会向服务器发送多个请求。喜欢:
...
nameService.index(); // console.log server
nameService.index(); // console.log server
nameService.index(); // console.log server
...

他们都解雇了server
,但我需要缓存。我有多个控制器具有相同的服务。向服务器发送一个请求的最佳方法是什么?
答案 0 :(得分:1)
如何阻止对服务器的相同请求?
好吧,您可以将$http.get('/api/name')
更改为$http.get('/api/name', {cache: true})
,这实际上已内置到Angular中并且运行正常。
这带来了一个有趣的问题,即如何在不使用Angular帮助实现通用承诺的情况下实现这一目标 - 同样简单:
this._data = null;
this.index = function() {
return this._data || (this._data = $http.get('/api/name'));
}
这样,如果它被缓存,它将返回左侧,如果不是,它将缓存右侧。
重要的是我们缓存了承诺而不是数据。那是你一直缺少的“诡计”。
答案 1 :(得分:0)
你可以通过下一步来做到这一点
app.service('nameService', ['$q','$http', function($q, $http){
var that = this;
that.nameDeffered = null;
this.index = function(){
if (that.nameDeffered === null) {
that.nameDeffered = $q.defer();
$http.get('/api/name').success(
function(response) {
// fired request to server
console.log('server');
that.nameDeffered.resolve(response.name);
}
);
}
return that.nameDeffered.promise;
}
}]);