angular-cached-resource
Version:
An AngularJS module to interact with RESTful resources, even when browser is offline
48 lines (36 loc) • 1.86 kB
text/coffeescript
processReadArgs = require './process_read_args'
modifyObjectInPlace = require './modify_object_in_place'
module.exports = readCache = ($q, providerParams, name, CachedResource, actionConfig) ->
ResourceCacheEntry = require('./resource_cache_entry')(providerParams)
->
{params, deferred: cacheDeferred} = processReadArgs($q, arguments)
httpDeferred = $q.defer()
instance = new CachedResource
$promise: cacheDeferred.promise
$httpPromise: httpDeferred.promise
cacheEntry = new ResourceCacheEntry(CachedResource.$key, params).load()
readHttp = ->
resource = CachedResource.$resource[name].call(CachedResource.$resource, params)
resource.$promise.then (httpResponse) ->
modifyObjectInPlace(instance, httpResponse)
cacheDeferred.resolve instance unless cacheEntry.value
httpDeferred.resolve instance
# when the response to a read arrives after a write has been dispatched but not completed,
# I am not really sure what should happen here. For now, let's just log an error message
# and overwrite the cache entry. This is a way that we could lose data :(
if cacheEntry.dirty
providerParams.$log.error "unexpectedly setting a clean entry (load) over a dirty entry (pending write)"
cacheEntry.set httpResponse, false
resource.$promise.catch (error) ->
cacheDeferred.reject error unless cacheEntry.value
httpDeferred.reject error
if cacheEntry.dirty
CachedResource.$writes.processResource params, readHttp
else if not actionConfig.cacheOnly
readHttp()
if cacheEntry.value
angular.extend(instance, cacheEntry.value)
cacheDeferred.resolve instance
else if actionConfig.cacheOnly
cacheDeferred.reject new Error "Cache value does not exist for params", params
instance