2012-11-16 4 views
0

이것은 매우 간단 할 수 있지만 저를 뒤 흔드는 것입니다. 함수의 범위 밖에서 다른 변수에 javascript 변수를 반환하려면 노력하고있어. 웬일인지, 할당은 일어나지 않고있다. 내 코드는 다음과 같습니다.Jquery/JS 범위 지정

var time = Math.round(((new Date()).getTime())/1000); 

// first call to get data 
var power_now = get_data(<%= @user.id %>, time); 

function get_data(user_id, timestamp){ 
    var targetURL = "get/user_data?time_now="+timestamp+"&user_id="+user_id; 
    var power = 0; 

    $.get(targetURL, function(data){ 
    power = data[0]['power']; 
    alert(power); 
    }) 

    return power; 
} 

$('body').html('<h1>'+power_now+','+power_then+'</h1>') 

.get 함수 내에 경고 (전원)를 넣으면 값이 정확합니다. 그러나 .get 함수 외부에 배치하면 값은 0입니다.

어쩌면 자바 스크립트에서 범위 지정에 대해 뭔가 빠졌습니까?

감사합니다.

+1

왜'@ user.id'를'get_data' 함수에 두 번 바인드합니까? 그리고 당신은'timestamp'를 지나치고 그것을 사용하지 않습니다. – Shmiddty

+0

네 말이 맞아. 기능적으로 동일; 일부 코드를 리팩토링하여 전달 된 변수를 사용하는 것을 잊었습니다. 응답 수정. – jasdeepg

답변

4

get 설정 일부 특정 매개 변수 .ajax 동의어입니다. AJAX의 첫 번째 A는 비동기입니다. 즉, 코드가 즉시 실행되지 않고 요청을 보내고 계속 이동합니다. 따라서 return 문 다음에야 해당 변수가 할당됩니다.

대신 콜백에 코드를 이동해야합니다 :

$.get(targetURL, function(data){ 
    power = data[0]['power']; 

    $('body').html('<h1>'+power_now+','+power_then+'</h1>') 
}) 
+0

또 다른 옵션이 있습니다. 그러나 거의 대답하지 않기 때문에 답변에 넣지는 않겠습니다. 'get '을'ajax'로 변경하면'async : false'를 설정하여 코드가 응답을 기다리게 할 수 있습니다. 응답을 기다리는 동안 브라우저가 멈추는 것은 거의 항상 나쁜 생각입니다. –

+0

함수를 두 번 이상 GET 데이터로 호출 한 다음 스크립트 내에서 여러 변수에 할당하고 싶습니다. 예를 들어, power_now와 power_then는 다른 타임 스탬프를 가지고 있습니다. 귀하의 방법에서, 나는 임무를 확인하고 .get 기능으로 인라인으로 업데이트해야하는 구성 요소를 업데이트해야합니다. 필요한 경우이 메소드를 호출하는 다른 방법이 있습니까? 어쩌면 동기식으로 만들지 만 왜 그 것이 나쁜지 이해할 수 있습니다 ... – jasdeepg

+0

여러 호출이 반환 될 때까지 기다릴 필요가 있다면 jquery의'when'을 사용할 수 있습니다 http://api.jquery.com/jQuery.when/ –

2

$.get은 서버가 응답하기 전에도 함수가 0을 반환한다는 것을 의미하는 aysc AJAX 호출입니다.

power_now을 설정하거나 해당 코드를 호출하려면 콜백 함수를 사용해야합니다.

당신을 위해 작동하는 경우 당신은 다음과 같은 코드를 수정할 수

var power_now = 0; 
get_data(<%= @user.id %>, time); 

function get_data(user_id, timestamp){ 
    var targetURL = "get/user_data?time_now="+time+"&user_id="+<%= @user.id %>; 

    $.get(targetURL, function(data){ 
    power_now = data[0]['power']; 
    $('body').html('<h1>'+power_now+','+power_then+'</h1>') 
    }) 
}  
2

$.get 비동기 아약스 호출입니다. 성공 함수에서 결과 조치를 지정해야합니다.

var time = Math.round(((new Date()).getTime())/1000); 

// first call to get data 
var power_now = get_data(<%= @user.id %>, time); 

function get_data(user_id, timestamp){ 
    var targetURL = "get/user_data?time_now="+time+"&user_id="+<%= @user.id %>; 
    var power = 0; 

    $.get(targetURL, function(data){ 
    power = data[0]['power']; 
    alert(power); 
    }) 

    .success(function() { $('body').html('<h1>'+power+','+power_then+'</h1>') }) 
}