我想缓存响应[即已解析的 JSON 响应] 的 HTTP 请求,而不是响应本身。我的数据很大并且是 gzip 压缩的,所以解压缩它实际上对性能有一定的影响,所以我想自己存储原始数据。
目前我正在使用 HTTP 拦截器进行缓存和 TimeToLive 机制 described here与 AngularJS 内置的 $cacheFactory
一起。
那么我如何使用拦截器停止 HTTP 请求并返回我自己的响应。注意我仍然计划使用 $cacheFactory
,我只是管理我自己的数据。
.factory('cacheInterceptor', ['$cacheFactory', function($cacheFactory) {
return {
request: function(config) {
if (config.cache) {
// if we have stored this request, return it, else let the request happen naturally and cache after
// Things I don't know:
// How to return existing cache data and prevent the reqeust from happening
// Cache the data I get back from a HTTP request
}
return config;
}
};
}])
最佳答案
我更愿意将其注入(inject)到您的服务中,让您的工厂只处理接收/缓存的数据。这次我只为您创建了一个服务,它包含 HTTP/Cache 切换的逻辑。我认为您将能够创建一个工厂来自行处理您的数据/状态。
.service('getService', ['$cacheFactory', '$http', '$q', function($cacheFactory, $http, $q) {
return {
request: function() {
function getData () {
var deferred = $q.defer();
if (angular.isUndefined($cacheFactory.get('getServiceData'))) {
$http({
'method': 'GET',
'url': 'someUrl'
}).then(function (result) {
$cacheFactory.put('getServiceData', result.data);
deferred.resolve(result.data);
});
} else {
deferred.resolve($cacheFactory.get('getServiceData'));
}
}
return getData();
},
flush: function () {
$cacheFactory.remove('getServiceData');
},
refresh: function () {
this.flush();
return this.refresh();
}
};
}]);
关于angularjs - HTTP 请求的自定义缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42829196/