Как я могу кешировать 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"];

0 ответов

Другие вопросы по тегам