javascript回调的范围问题

时间:2012-01-14 08:50:42

标签: javascript jquery scope

我有一个调用另一个函数的函数,我想将返回的结果存储在一个变量中:

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 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

答案 2 :(得分:0)

您需要在函数范围外声明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;
}