1

私は (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())が、それが約束の目的ですよね?

前もって感謝します

4

1 に答える 1

0

グローバルオブジェクトとしてdefferedを保持しているため、問題が発生しています。これは一度だけ解決されるため、これを回避するには、グローバルレベルではなくget関数内でdeferredを宣言する必要があります

于 2013-08-08T09:49:27.820 に答える