2015-01-28 2 views
0

가 나는 등과 같은 공장 things에 추가) getThings()이 빈 배열을 반환해야하므로 $http.post() 호출이 해결되기 전에 반환해야합니까?비동기 각도 약속 및 변수 초기화

더 나은 대안인가요?

app.controller('myController', function($scope, thingFactory) { 
    $scope.things = [] 

    thingFactory.initializeThings 
     .then(function(response) { 
      $scope.things = response.data; 
     }, function (response) { 
      // some error handling code here... 
     }); 
} 

컨트롤러가 약속을 생각하지 않고 안전하게 가져올 수있는 안전한 대안이 있습니까?

+0

'getThings'가 약속을 반환하지 않는 이유는 무엇입니까? – Bergi

답변

1

당신은 분명히 문제가 될 것입니다. 팩토리가 컨트롤러에 의해 사용 될 때까지는 팩토리가 인스턴스화되지 않기 때문에, 컨트롤러에 의해 불려 갈 때까지 things는 초기화되지 않습니다. 을 호출하기 전에 initializeThings가 호출됩니다. 또한 "거기에 있기를 바랍니다"라는 접근 방식을 따르는 것이 결코 좋은 생각이 아닙니다. 내가 취할 수있는 두 가지 방법을 참조

는 : getThings는 인수로 콜백을 수락하거나 그것은 다음과 같이 보일 수있는 약속, 반환

  1. 콜백 - 나는 약속을 통해 콜백을 선호을, 그러나 그것은이다 개인적인 것. 또한, 나는 NodeJS - 영감 구문을 사용합니다

    var things; // no need to initialize array 
    
    // callback -> function (error, things) {} 
    factory.getThings = function (callback) { 
        if (things) { 
        return callback(null, things); 
        } 
    
        factory.refreshThings() 
        .then(function (response) { 
         things = response.data; 
         return callback(null, things); 
        }, function (reason) { 
         return callback(reason); 
        }); 
    } 
    
  2. 약속 -하지 최고의 구문을하지만, 당신은을 사용하는 경우 당신은 측면 참고로 생각

    factory.getThings = function() { 
        var d = $q.defer(); 
        // I'm sure there's a better way to do this, but setting 
        // this in a timeout will allow the promise to return so that 
        // you can try to return it. 
        $timeout(function() { 
        if (things) { 
         return d.resolve(things); 
        } 
    
        factory.refreshThings() 
         .then(function (response) { 
         things = response.data; 
         return d.resolve(things); 
         }, function (reason) { 
         return d.reject(reason); 
         }); 
        }); 
    
        return d.promise; 
    } 
    

를 얻을 수 RESTful API, POST 대신 정보를 얻으려면 GET을 사용해야합니다.