2012-01-14 4 views
1

У меня есть функция, которая вызывает другую функцию, и я хочу, чтобы сохранить возвращаемый результат в переменном:Scoping проблемы с яваскриптом обратного вызова

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

Вызванная функция запускает запрос AJAX, которая вызывает обратный вызов приема JSON:

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; 
} 

проблема заключается в том, что channel_name в trigger_gridly() не получает значение channel_name в функции обратного вызова handleJson. Как я могу предоставить данные в обратном вызове функции trigger_gridly()?

+0

Вы думаете об этом в синхронном режиме. Выполнение асинхронного запроса и наличие простой функции getter, которая возвращает значение, невозможно, если значение не было предварительно заполнено. Что именно ты пытаешься сделать? Вероятно, для этого нужно больше ориентироваться на обратную связь, чем функция trigger_gridly. – Corbin

+0

Я пытаюсь получить объект json на стороне клиента из другого домена, чем сервер. –

+0

И что с этим делать? Возможно, вы должны передать свою функцию, которая фактически выполняет обработку как обратный вызов. В противном случае, как вы узнаете, когда переменная была установлена ​​и когда она не была? (Без использования чего-то взломанного, как бесконечный цикл, который ломается, когда он установлен или что-то еще.) – Corbin

ответ

0

это довольно уродливое, но это будет работать, асинхронные процессы всегда немного сложны getJSON is async.

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

Необходимо указать имя канала за пределами области действия. Тем не менее, я не уверен, что это даст вам то, что вы хотите. Это настроено для асинхронного запроса/ответа. Вы хотите выполнить свои действия, которые используют имя канала в функции 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); 
} 

EDIT: альтернатива, что я немного лучше нравится:

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); 
Смежные вопросы