2014-12-02 8 views
0

데이터를 변수에 저장하는 방법이 있습니까?변수에 대한 AngularJS 서비스

$scope.another = 
     function(){ 
      var new_data; 
      userService.getInfo().success(function(data){ 
       new_data = data; 
      }); 
      return new_data; 
     }; 

var data = $scope.another(); 

을 있지만 콘솔 로그에 '정의되지 않은'반환 :

나는 시도했다.

편집 주셔서 감사합니다

지금 new_data에 대한 하늘의 배열을 얻는다.

var new_data = []; 

$scope.another = 
       function(callback){ 
        userService.getInfo().success(function(data){ 
         paymentService.getCashierParams({ "cardNumber": data.cardNumber}).success(function(data){ 
          gameService.getAllgames({ "PID":data.GetCashierParameters.PID, "limit": 6, "skinID": 1}).success(function(data) { 
           callback(data.data.GetFlashGamesResult.Data.FlashGame); 
          }); 
         }); 
        }); 
       }; 
      $scope.another(function(result){ 
        new_data = result; 
       }); 
       console.log(new_data); 
+2

문제는이의 중복, getInfo'이 asynchronus은'이다 [비동기 콜백 함수에서 값을 반환하는 방법?] (http://stackoverflow.com/q/6847697/ 359284). –

+0

이것은 또 다른 비동기 js 질문입니다. 일부 console.log 문을 던져보고 무슨 일이 일어나는지 확인하십시오. – Stephen

+0

변수에 저장하려는 데이터를 기록합니다. – sanosuke

답변

1

이 문제를 다르게 생각해야합니다. getInfo 메서드는 약속을 반환합니다. 약속의 성공 콜백은 즉시 호출되지 않습니다. 언젠가는 나중에 호출 될지도 모르지만 코드는 계속 실행되고 $scope.another의 반환 값은 undefined이 될 것입니다.

을 실행하려는 로직을 성공 콜백 내에 넣으십시오.

userService.getInfo().success(function (data) { 
    // Do stuff with data. 
}); 

비동기 데이터로 작업하는 데 익숙하지 않은 경우 이상하게 보일 수 있습니다. 그러나 네트워크 요청, 데이터베이스 읽기 등이 완료되는 동안 잠재적으로 수 초 동안 페이지를 매달리는 대안보다 훨씬 낫습니다.

들여 쓰기가 걱정되면 별도의 기능을 만들어 데이터를 처리 할 수 ​​있습니다.

function processData(data) { 
    // Process stuff... 
    return data; 
} 

function handleData(data) { 
    data = processData(data); 
    console.log(data); 
} 

userService.getInfo().success(handleData); 
+0

이제 빈 배열이 생깁니다. – sanosuke

+0

최근 편집에서 여전히 콜백에서 논리를 처리하지 않습니다. '$ scope.another (function (result) {console.log (result);});'가 작동합니다. '$ scope.another'에 전달 된 콜백은'console.log (new_data);가 실행되기 전에 실행되지 않을 것입니다. 또한, new_data를 1 행의 빈 배열로 설정 했으므로 빈 배열을 "가져 오는 중"입니다.'new_data' 변수가 없어도 그냥 제거 할 수 있습니다. – Jackson

+0

'$ scope.another' 다음에'console.log (new_data)'가 실행되도록하기 위해 내가해야 할 일은 무엇입니까? 나는'console.log'가'$ scope.another' 이전에 실행되었다는 것을 알아 차 렸습니다. – sanosuke

0

이는 사용자가 호출 한 비동기 기능 때문입니다. 대신 콜백을 사용해보십시오. 이런 식으로 뭔가 :

$scope.another = 
    function(fn){ 
     userService.getInfo().success(function(data){ 
      fn(data); 
     }); 

    }; 


    var data = $scope.another(function(doSomething) { 
    alert(doSomething); 
    return doSomething; 
}; 
+0

나는 어떻게되는지 모르지만 나는 여전히 정의되지 않은 결과를 얻는다. – sanosuke

+0

@ sanosuke : console.log는 어디에 넣었습니까? $ scope.another 호출 후에 처리하면 의미가 있습니다. async는 대기하지 않고 대신 다음 줄로 이동합니다. var 데이터를 먼저 선언 한 다음 $ scope.another를 호출하십시오. 데이터에 여전히 이전 값이 있으면 비동기 호출이 아직 완료되지 않았 음을 의미합니다. 약속 사용 – geckob