在从工厂返回数据之前调用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或其他方式来清除先前的承诺。
提前致谢。
答案 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;
}
}]);