2014-01-08 2 views
0

데이터가 공장 출하 전에 약속이 호출 될 때 문제가 있습니다. 나는 특정 국가의 주 목록으로 검색하고 가져 오는 공장을 가지고있다.AngularJS Cached Promise

컨트롤러가 처음로드되면 지정된 국가에 대한 상태 목록이 올바르게 표시됩니다. 그러나 changeCountry 함수가 호출되고 새 상태 목록을 가져 오기위한 호출이 호출되면 약속은 데이터가 반환되기 전에 해결됩니다. 즉, "then"은 "resolve"전에 호출되고 데이터는 이전 호출에서 반환됩니다.

공장 :

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() 
]) 

데이터가 크게 감상 할 첫 번째 약속을 반환하지 두 번째 약속을하는 방법에 대한 조언을. 이전 약속을 지우려면 $ 타임 아웃이나 다른 방법으로 필요한 것이 있는지 확실하지 않습니다.

미리 감사드립니다.

+0

은 (는) coffeescript가 아니십니까? – Jorg

답변

1

나는 잘 coffescript를 이해하지 못한다. 그러나 나는 당신이 get 함수를 호출 할 때마다 새로운 지연 객체를 생성해야한다고 생각한다. 자바 스크립트 코드는 다음과 같아야합니다.

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

    get: function(country_code) { 

     var deferred = $q.defer() 

     // remainder code 

     return deferred.promise; 
    } 

}]); 
+0

고마워요! 나는 $ q.defer()를 get 함수로 옮겼고 데이터는 올바르게 전달되었다. 데이터가 get 호출 외부에있을 때 변수가 공장에서 저장되는 것처럼 보입니다. – SkyOut