Проблема определения объема с обратным вызовом JavaScript - PullRequest
1 голос
/ 14 января 2012

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

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()?

Ответы [ 3 ]

1 голос
/ 14 января 2012

Как уже указывали другие, 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);
0 голосов
/ 14 января 2012

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

это довольно уродливо, но это будет работать, асинхронные процессы всегда немного сложны 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...