Асинхронный $cacheFactory с $http и $resource

Я пытаюсь реализовать асинхронный кеш поверх $resource, используя $cacheFactory.

Покопавшись в источнике $http, он, похоже, поддерживает возврат обещаний из кеша. Я бы предположил, что после этого я мог бы просто выполнить обещание с данными кеша или отклонить его и позволить $http сделать свое дело, что затем поместит данные обратно в кеш. Проблема в том, что я просто не работаю. Поддерживает ли $http ДЕЙСТВИТЕЛЬНО обещания?

https://github.com/angular/angular.js/blob/master/src/ng/http.js#L895

  if (cache) {
    cachedResp = cache.get(url);
    if (isDefined(cachedResp)) {
      if (isPromiseLike(cachedResp)) {
        // cached request has already been sent, but there is no response yet
        cachedResp.then(removePendingReq, removePendingReq);
        return cachedResp;
      } else {
        // serving from cache
        if (isArray(cachedResp)) {
          resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);
        } else {
          resolvePromise(cachedResp, 200, {}, 'OK');
        }
      }
    } else {
      // put the promise for the non-transformed response into cache as a placeholder
      cache.put(url, promise);
    }
  }

Здесь $http обрабатывает кэширование, как вы можете видеть, он действительно проверяет, возвращается ли промис (строка № 898). Но похоже, что и разрешение, и отклонение просто удаляют запрос из очереди ожидания. Как мне на самом деле отправить данные или один $ http, чтобы продолжить запрос?

Вот Plunker о том, чего я пытаюсь достичь.

http://plnkr.co/edit/TwXumrAunG9b5JKo5OlB?p=preview


person Morgan ARR Allen    schedule 23.07.2014    source источник
comment
Как говорится в комментарии, элемент кеша может быть обещанием, которое не разрешено, то есть вызовом, который еще не завершен. Кэшированное обещание возвращается, так что да, оно работает с обещаниями. Я не совсем уверен, чего вы хотите достичь? Этот кеш представляет собой кеш HTTP-ответов, в котором хранятся такие вещи, как строки и json, которые можно вернуть по сети. Единственная причина, по которой существует промис, заключается в том, чтобы указать, что вызов выполняется.   -  person Jon    schedule 24.07.2014
comment
вы нашли решение для этого?   -  person MayK    schedule 27.01.2016
comment
Да, перестаньте использовать Angular. :) Согласно «Правильному ответу», это была ошибка. Не уверен, каков статус в настоящее время, я не использовал Angular вскоре после того, как был задан этот вопрос.   -  person Morgan ARR Allen    schedule 28.01.2016


Ответы (1)


В AngularJS есть ошибка. При разрешении (или отклонении) обещанного возврата из кеша $http никак не обрабатывает данные.

Связанная ошибка https://github.com/angular/angular.js/pull/6534

person Morgan ARR Allen    schedule 29.07.2014