2012-01-14 4 views
1

내가 다른 함수를 호출하는 기능을 가지고 있고이 변수에 반환 된 결과를 저장할 :범위 지정 문제

function trigger_gridly(){ 
    var channel_name = get_channel_name(); 
} 

호출 된 함수가 JSON을받는 콜백을 트리거하는 AJAX 요청을 트리거 :

function get_channel_name(){ 
    var channel_name;  
    $.getJSON(APPLICATION_DOMAIN + "channels/new.json?callback=?", null, handleJson); 
} 

function handleJson(channel){ 
    var channel_name = channel.name; 
    return channel_name; 
} 

문제 trigger_gridly()에서 channel_namehandleJson는 콜백 함수 channel_name 값을받지 않는다는 것이다. 콜백에있는 데이터를 trigger_gridly() 함수에 공개하려면 어떻게해야합니까?

+0

당신은 동기 방식으로 이것에 대해 생각하고있다. 비동기식 요청을 수행하고 값이 미리 채워져 있지 않으면 값을 반환하는 간단한 getter 함수를 사용할 수 없습니다. 너 정확히 뭘 하려구? 그것은 아마도 당신의 trigger_gridly 함수보다 콜백 지향적 일 필요가있을 것이다. – Corbin

+0

서버가 아닌 다른 도메인에서 클라이언트 쪽에서 json 개체를 가져 오려고합니다. –

+0

그리고 그걸로 무엇을 할 수 있습니까? 콜백 함수를 실제로 처리하는 함수를 전달해야합니다. 그렇지 않으면 변수가 설정된시기와 실행되지 않은시기를 어떻게 알 수 있습니까? (일단 무언가가 설정되었거나 무언가가 깨지는 무한 루프와 같은 해키를 사용하지 않고) – Corbin

답변

0

꽤 못 생겼지 만 비동기 프로세스는 항상 조금 까다 롭습니다 getJSON은 비동기입니다.

function get_channel_name(fn) { 
    $.getJSON(APPLICATION_DOMAIN + "channels/new.json?callback=?", null, function(channel) { 
     fn(channel.name); 
    }); 
} 

var channel_name; 
get_channel_name(function(name) { 
    channel_name = name; 
}); 
// but here channel_name is still undefined 
+0

결국'channel_name'이 정의 될 것이기 때문에 이것은 작동 할 것입니다. 그러나 예상되는 위치는 정의되지 않습니다. 'get_channel_name'을 호출 한 직후의 의미. – greut

+0

그게 무슨 뜻인지는 모르겠지만, 사과해야합니다. 코드에서 주석을 잘못 읽었습니다. 나는 그 정의가 * 정의 된 것이라고 생각했습니다. 맞춰봐, 아직 내겐 너무 이른 것 같아.) 신경 쓰지 마, 내 의견을 지웠다 .... –

0

function scope 외부에서 channel_name을 선언해야합니다. 그러나 이것이 내가 원하는 것을 얻을 수 있을지 확신하지 못합니다. 이것은 비동기 요청/응답을 위해 설정됩니다. handleJson() 함수에서 채널 이름을 사용하는 작업을 수행하려고합니다. 이처럼

:

다른 사람들이 지적했듯이
var CHANNEL_NAME; 

function trigger_gridly(){ 
    get_channel_name(); 
} 

function get_channel_name(){ 
    $.getJSON(APPLICATION_DOMAIN + "channels/new.json?callback=?", null, handleJson); 
} 

function handleJson(channel){ 
    CHANNEL_NAME = channel.name; 
} 
1

는,해서 getJSON 비동기 호출입니다. 채널을 사용할 수 있으려면 콜백 호출을 기다려야합니다. 여기에 내가 그것을 코딩하는 방법입니다 :

function trigger_gridly() { 
    get_channel_name(function(channel){ 
     var channel_name = channel.name; 
     // Do something with channel_name 
    }); 
} 

function get_channel_name(success) { 
    $.getJSON(APPLICATION_DOMAIN + "channels/new.json?callback=?", null, success); 
} 

편집 : 나는 약간 더 좋아 대안 :

function trigger_gridly(channel) { 
    var channel_name = channel.name; 
    // Do something with channel_name 
} 

function get_channel_name(success) { 
    $.getJSON(APPLICATION_DOMAIN + "channels/new.json?callback=?", null, success); 
} 

get_channel_name(trigger_gridly);