我有以下场景:我正在加载和缓存一些数据以避免相同信息的http请求,但我不确定我是否正确地执行了此操作:
在服务中:
this.get = function(id){
var that = this,
promise;
if(that.loadedData){
// resolve it right away if data is present
promise = $q.defer();
promise.resolve(that.loadedData);
promise = promise.promise;
}else{
promise = $http.get('/get/'+id).then(function(response){
that.loadedData = response;
});
}
return promise
};
在控制器中:
someService.get().then(function(){
$scope.data = someService.loadedData;
});
特别是我手动创建承诺并立即解决它的部分“感觉不对”,但这是我找到的唯一方法。是否有一些处理这种情况的模式?
答案 0 :(得分:3)
立即解决问题不是问题,但我认为从承诺中回归是更好的做法:
this.get = function(id){
var that = this;
var deferred = $q.defer();
if(that.loadedData){
// resolve it right away if data is present
deferred.resolve(that.loadedData);
}else{
$http.get('/get/'+id).then(function(response){
that.loadedData = response;
deferred.resolve(response);
});
}
return deferred.promise;
};
使用promise的意义是在异步函数中使用它,在这种情况下是$ http.get()。你会在很多角度教程中看到很多这种模式。
答案 1 :(得分:2)
你在做什么似乎是一项大量的手工工作。我建议使用Restangular:
https://github.com/mgonto/restangular#can-i-cache-requests
但你也可以用纯角度达到同样的效果。看看:
http://docs.angularjs.org/api/ng/service/$cacheFactory
在大多数情况下,我建议在尝试自己解决问题之前使用并尝试查找现有解决方案。话虽如此,除了代码看起来很难吃之外,我也认为你的方法没有错。
答案 2 :(得分:1)
是的,有一个。
$http
中的AngularJS有自己的缓存实现。只需在其选项中将cache
设置为 true :
然后首先检查缓存中的数据,如果没有 - 请问后端。
this.get = function (id) {
var cache = $cacheFactory('myCache'),
that = this;
this.loadedData = cache.get();
if( !this.loadedData ) {
return $http.get('/get/'+id, {cache: true}).then(function(response){
that.loadedData = response;
});
}
return $q.when( this.loadedData );
};
您还需要从此方法返回一个承诺。这就是我们将$q.when( this.loadedData )
和$http
包裹起来的原因
Docs cacheFactory