2015-01-07 3 views
2

есть ли индикация от $http, если ответ получен из кеша?
Например позволяет сказать, что я сделал это два вызова:

$http.get({url, cache: true).then(function(response, ..., moreData) { alert(moreData.fromCache) }) //alerts false 

$http.get({url, cache: true).then(function(response, ..., moreData) { alert(moreData.fromCache) }) //alerts true 

, как вы можете видеть, что первый вызов действительно выполняет вызов Ajax, так что не из кэша, второй приводит данные из кэша, так это alerting true

ответ

1

Я не уверен, что информация раскрыта - в документации упоминается, что даже если ресурс кэшируется, запрос (с использованием кеша) будет по-прежнему асинхронным, поэтому он будет выглядеть как любой другой запрос. Единственное, что я могу придумать, - это скопировать свой собственный кеш и использовать это, чтобы знать, когда произошел успешный поиск. Из документации:

Вы можете изменить кэш по умолчанию для нового объекта (построен с $ CacheFactory) путем обновления свойства $ http.defaults.cache. Все запросы , задающие свой кеш-значение true, теперь будут использовать этот кеш .

+2

Надеюсь, что есть данные, если данные получены из кеша или нет. Если нет такого указания, я думаю, что это будет очень приятная функция. – vlio20

1

Вы можете узнать, был ли вызов кэширован через инструменты разработчика Chrome, просмотрев вкладку «Сеть». Он скажет вам, был ли он кэширован или был вызван.

+1

Мне нужно, чтобы это было программно – vlio20

0

Легко определить, что что-то кэшировано с обработчиками запросов и ответов с оговоркой. Этот ONLY обрабатывает случай, когда первый запрос завершен BEFORE второй. Если вы сделаете 2 requests до того, как первый вернется, что угловой кеш будет обрабатывать как шарм и сделать только один служебный вызов, оба будут отображаться как не кешированные, что технически верно, так как они оба ожидали по первому запросу кэшированный, но может и не быть тем, что вы хотели.

$httpProvider.interceptors.push(function() { 
    return { 
     'request': function requestInterceptor(config) { 
      if (config.cache) { 
       //Determine if a custom cache object is being used 
       var cache = angular.isObject(config.cache) ? config.cache : $http.defaults.cache; 
       config.wasCached = cache.get(config.url) ? true : false; 
      } 

      return config; 
     }, 

     'response': function(response) { 
      if (response && response.config && response.config.wasCached) { 
       console.log('Was Cached!') 
      } 
      return response; 
     } 
    }; 
});