AngularJS缓存承诺

时间:2014-01-08 23:09:29

标签: javascript angularjs

在从工厂返回数据之前调用promise时遇到问题。我有一个工厂,可以从指定国家/地区检索状态列表。

第一次加载控制器时,它会正确获取指定国家/地区的状态列表。但是,当调用changeCountry函数并调用获取新状态列表的调用时,promise将在工厂有机会返回数据之前解析。换句话说,在“解析”之前调用“then”,并从先前的调用返回数据。

工厂:

app.factory('localStates', ['$http', '$q', ($http, $q) ->
    # set deferred object for use later
    deferred = $q.defer()

    # get states
    get: (country_code) ->

        # query for list of states
        $http
           method: 'GET'
            url: '/api/areas'
            params:
                country_code: country_code
        .success (data, status) ->
            # send data through promise
            deferred.resolve data
        .error (data, status, headers, config) ->
            # send error data through promise
            deferred.reject data

    return deferred.promise

])

控制器

app.controller('LocalNumberCtrl', ['$scope', 'localCountries', 'localStates',($scope, localCountries, localStates) ->

    getStates = ->

        localStates.get($scope.LocalCountry).then (data) ->

            # set scope variable
            $scope.States = data

        , (data) ->
            # get states error

    # get local countries list
    localCountries.get().then (data) ->

        # set scope variable
        $scope.Countries = data

        # set default country
        $scope.LocalCountry = 'GB'

        # get list of states
        getStates()

     , (data) ->
         # get countries error

    $scope.changeCountry = ->

        getStates()
])

关于如何获得第二个承诺不返回第一个承诺数据的任何建议将不胜感激。我不确定是否需要使用$ timeout或其他方式来清除先前的承诺。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我不太了解coffescript,但我认为你需要在每次调用get函数时创建一个新的延迟对象。 你的javascript代码应该是这样的:

app.factory('localStates', ['$http', '$q', function($http, $q) {

    get: function(country_code) {

        var deferred = $q.defer()

        // remainder code 

        return deferred.promise;
    }

}]);