Как я могу кешировать HTTP-запросы, но не сохраняя их в виде строки
В настоящее время я использую http-кэширование во всем приложении. Это замечательно и позволяет любому легко разрешить кэширование по запросу, т.е.
return this
.$http({
url: "/api/vehicles",
method: "GET",
cache: true,
params: { minsToLive: 30, invalidateCache: invalidateCache }
})
Тогда у меня есть cacheInterceptorService
(ниже), который обрабатывает недействительность и т. д.
Это все работает, однако, используя встроенный $http
кэш подвергается дорогостоящему JSON-разбору при каждом доступе к кешу. Это потому, что кэш на самом деле хранит $http
ответ, в отличие от проанализированного JSON. Некоторые из моих полезных нагрузок довольно велики, и время синтаксического анализа JSON становится большим.
Итак, мой вопрос заключается в следующем: как мне кэшировать ответ JSON, а не весь ответ GET для отмены времени анализа? В идеале я хотел бы изменить это на уровне перехватчика, чтобы не нужно было изменять отдельные службы для поддержки нового кэширования.
export class CacheInterceptor {
httpTimeToLiveCache: [string, number] = [] as any;
static Factory($cacheFactory: angular.ICacheFactoryService) {
return new CacheInterceptor($cacheFactory);
}
constructor(private $cacheFactory: angular.ICacheFactoryService) {
}
request = (config: angular.IRequestConfig) => {
if (config.params) {
if (config.params.invalidateCache) {
this.invalidateCache(config);
}
else if (config.params.minsToLive) {
config.cache = true;
const n = config.params.minsToLive * 60 * 1000; // convert from minutes into milliseconds
if (new Date().getTime() - (this.httpTimeToLiveCache[config.url] as any || 0) > n) {
this.invalidateCache(config);
}
}
}
this.removeCacheVariables(config);
return config;
}
private invalidateCache(config: angular.IRequestConfig) {
this.removeCacheVariables(config);
this.$cacheFactory.get("$http").remove(config.url);
this.httpTimeToLiveCache[config.url] = new Date().getTime();
}
private removeCacheVariables(config: angular.IRequestConfig) {
if (config.params) {
delete config.params.invalidateCache;
delete config.params.minsToLive;
}
}
}
CacheInterceptor.Factory.$inject = ["$cacheFactory"];