私は (CoffeeScript で) Angular アプリを開発しており、キャッシュされたバージョン (ファイルから) またはデータベースからのいずれかの約束を果たす小さな 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()
、更新された正しいデータが表示されますが、promise (で$scope.refreshData()
) からデータをログに記録すると、古いデータが表示されます。
非同期リクエストの問題だと思います(promise.then
データからのデータの前にデータをログに記録しますgetData()
)が、それが約束の目的ですよね?
前もって感謝します