3

$ http.get의 데이터를 내 컨트롤러의 변수에 할당하려고합니다.

$http.get(URL).success(function (data) { 
     $scope.results = data; 
     console.log('results in $http.get :'+ $scope.results); 
    }); 

console.log('results after http.get'+ $scope.results); 

첫 번째 콘솔 로그 인쇄 데이터는 get입니다. $ http.get (url) .success 후 $ scope.results는 정의되지 않은 것으로 인쇄합니다.

+0

다른 답변은 메서드가 비동기이므로 즉시 반환됩니다. 성공 콜백은 변수를 채우고 완료 할 때 호출되며, 바인딩을 올바르게 설정하면 UI가 업데이트됩니다. 그것은 꼭해야만하는 것처럼 행동합니다. –

+0

이제 다음과 같은 데이터를 얻으려고합니다. var getSomething = function() { return $ http ({method : "GET", url : URL}) then (function (result) { return result.data; }}); }; 결과를 변수에 할당합니다. $ scope.results = getSomething(); – hwg

답변

8

$http.get은 비동기입니다. 따라서 아약스 요청이 완료 될 때까지 코드를 보류하지 않고 나머지 코드를 실행합니다. 따라서 두 번째 console.log은 ajax 요청이 완료되기 전에 실행됩니다. 이 시점에서 $scope.results이라는 범위 변수가 없으며 요청이 완료된 후에 만 ​​정의되므로 그 이유는 undefined입니다. 첫 번째 console.log$http 아약스가 성공한 후에 만 ​​인쇄됩니다.이 시점에서 $scope.results은 백엔드에서 data으로 할당됩니다.

+0

@ktoress 그래서 http.get이 비동기가 아니며 범위의 값을 가져 오는 방법은 무엇입니까? – Demodave

+0

값은 $ scope로 이동하지만 더 오래 걸릴 수 있습니다 (0.5 초라고 가정 해 봅시다). 요점은 언제 어디에서 사용하고 싶습니까? 보기에 표시하려면 이벤트를 사용하여 이벤트가로드되었는지 또는 대기 상태인지 확인하십시오. 다른 함수에 필요한 경우 sucess() 호출에서 해당 함수를 호출 할 수 있습니다. – Puce

2

$httpasynchronous입니다. 즉각 반환하지만 promise을 반환합니다. 요청이 완료되면 onsuccess이 호출됩니다.

console.log$http이 반환되기 전에 실행됩니다 (통화 외부의 사람) console.log.