2014-10-14 1 views
0

Скажем, в службе мне нужно сделать HTTP-запрос и сохранить значение, а затем, если что-то еще использует ту же службу, он может просто повторно использовать это сохраненное значение, без необходимости отправки запроса:

_cachedValue = null 
.factory('myService', ($http, $q)-> 
    getFoo: -> 
     dfrd = $q.defer() 
     if _cachedValue == null 
     $http.get('/foo').success (data)-> 
      _cachedValue = data 
      dfrd.resolve(_cachedValue) 
     else 
     dfrd.resolve(_cachedValue) 
     return dfrd.promise 

Этот вид работы. Проблема в том, что, когда два пользователя одновременно пытаются вызвать метод, он отправит два запроса. Поэтому мне нужно отправить запрос только в том случае, если он никогда не был отправлен, а когда второй потребитель вызывает getFoo, он просто подождёт, пока запрос не поступит.

Повторно проверяется каждые несколько миллисекунд до _cachedValue не null - звучит довольно глупо, правильно? Я не могу $watch об изменении стоимости (внутри службы не существует $ scope). Я могу использовать антенну событий angular и излучать событие через $rootScope. Но это звучит очень утомительно, так как никто, кроме службы, не будет заинтересован в том, чтобы слушать такое событие. Может ли кто-нибудь предложить лучший способ?

+0

Привет, почему не используя встроенный в кэш $ HTTP? см. https://docs.angularjs.org/api/ng/service/$http – OXMO456

+0

проблема не в кэшировании, проблема заключается в том, чтобы знать, был ли отправлен запрос и предотвратить его отправку. Тем не менее он все еще должен знать, когда запрос приходит через – Agzam

+0

с использованием 'cache: true', чтобы предотвратить его отправку повторно –

ответ

Смежные вопросы