Angularjs $ http cache, будет ли он кэшировать ошибки сервера

В угловом $http.get(url, {cache:true}) будут хорошо кэшировать ответы сервера. Но что делает кеш, когда запрос GET на сервер выходит из строя? Это может быть временная проблема с соединением или ответ сервера как тайм-аут.

Предположим, что я обрабатываю ошибку и отображаю кнопку повтора, будет ли последующий вызов $http.get(url, {cache:true}) повторить попытку сервера или это даст мне неудачное обещание из кеша?

1 ответ

Если к одному и тому же URL-адресу GET выполняется несколько запросов, кеш вызовет только один запрос. Цитирование документации:

Если есть несколько запросов GET для одного и того же URL-адреса, которые должны быть кэшированы с использованием того же кеша, но кеш еще не заполнен, будет выполнен только один запрос на сервер, а остальные запросы будут выполнены с использованием ответа от первого запроса,

Однако, когда этот запрос возвращает, если код состояния не удался, он не будет кэшироваться (он будет удален из кеша).

Мы можем видеть это в исходном коде:

/**
 * Callback registered to $httpBackend():
 * - caches the response if desired
 * - resolves the raw $http promise
 * - calls $apply
 */
 function done(status, response, headersString, statusText) {
 if (cache) {
 if (isSuccess(status)) {
 cache.put(url, [status, response, parseHeaders(headersString), statusText]);
 } else {
 // remove promise from the cache
 cache.remove(url);
 }
 }

Короче говоря, Angular не будет кэшировать "неудачные" запросы, то есть: запросы с кодом статуса неуспеха.

licensed under cc by-sa 3.0 with attribution.