我正在开发一个角度应用程序(在CoffeeScript中),并且有一个小型的PHP后端(是的,我知道),它为缓存的版本(从文件中)或从数据库中的版本提供了一个承诺。
我为此写了一个工厂:
@myApp.factory 'apiModel', ($http, $q) ->
deferred = $q.defer()
apiData = null
getData = (fromDb) ->
fromDb = (fromDb == true)
url = 'api.php?do=get';
# Append &refresh to get from database
if fromDb then url += '&refresh';
$http.get(url).success (data) ->
apiData = data
deferred.resolve data
.error ->
deferred.reject e.what()
return {
get: (fromDb) ->
if apiData == null || fromDb == true then getData(fromDb)
else deferred.resolve(apiData)
return deferred.promise
}我可以得到的数据很简单,如:
apiPromise = apiModel.get()
apiPromise.then (data) ->
$scope.updateData(data)
, (reason) ->
console.log reason到目前为止效果还不错。
然后,我想像这样实时刷新数据:
$scope.refreshData = ->
promise = apiModel.get(true) # get from DB
promise.then (data) ->
$scope.updateData(data)
, (reason) ->
console.log reason这不起作用。当我在getData()中记录响应时,它会显示正确的刷新数据,但是当我记录承诺中的数据(在$scope.refreshData()中)时,它会显示旧的数据。
我认为这是异步请求的一个问题(它在promise.then上记录数据,然后再记录来自getData()的数据),但这就是承诺的意义所在,不是吗?
提前感谢
发布于 2013-08-08 09:49:27
问题来了,因为您一直将其作为全局对象来处理,它将只解决一次,因此为了避免这种情况,您应该在get函数中声明延迟,而不是在全局级别上。
https://stackoverflow.com/questions/18120242
复制相似问题