让我们在服务中说我需要发出一个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)。我可以使用角度事件总线,并通过$rootScope
发出事件。但这听起来非常矫枉过正,因为服务之外的任何人都不会有兴趣听这种事件。有人可以提出更好的方法吗?
答案 0 :(得分:0)
您只应将$http
缓存属性设置为true
。
如果请求已在进行中,这将阻止更多请求。
请参阅:https://github.com/angular/angular.js/blob/master/src/ng/http.js#L987