Скажем, в службе мне нужно сделать 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
. Но это звучит очень утомительно, так как никто, кроме службы, не будет заинтересован в том, чтобы слушать такое событие. Может ли кто-нибудь предложить лучший способ?
Привет, почему не используя встроенный в кэш $ HTTP? см. https://docs.angularjs.org/api/ng/service/$http – OXMO456
проблема не в кэшировании, проблема заключается в том, чтобы знать, был ли отправлен запрос и предотвратить его отправку. Тем не менее он все еще должен знать, когда запрос приходит через – Agzam
с использованием 'cache: true', чтобы предотвратить его отправку повторно –