JavaScript函数返回undefined JSON对象(但它不是未定义!)

问题描述:

我试图返回从使用JSON jQuery插件(http://code.google.com/p/jquery-json/)功能的JSON对象,但在函数返回的对象之后,就变得不确定。JavaScript函数返回undefined JSON对象(但它不是未定义!)

$(document).ready(function() { 

    var $calendar = $('#calendar'); 

    $calendar.weekCalendar({ 

     ... 

     data : function(start, end, callback) { 
      var datas = getEventData(); 
      alert(datas); // Undefined??? 
     } 
    }); 

如果我返回之前检查的对象,它被定义。

function getEventData() { 
     var dataString = "minDate="+ minDate/1000 + "&maxDate=" + maxDate/1000; 
     //alert(dataString);return false; 
     $.ajax({ 
       type: "POST", 
       url: "busker_ops.php", 
       data: dataString, 
       dataType: "json", 
       success: function(data) { 
        if(data != null) { 
          var jsonArray = new Array(); 
          var jsonObj = {}; 
          for(var i = data.length - 1; i >= 0; --i) { 

           var o = data[i]; 
           var set_id = o.set_id; 
           var start = o.startOrig; 
           var end = o.endOrig; 
           var title = o.title; 
           var deets = o.deets; 
           jsonObj = 
            { 
             "id":parseInt(set_id), 
             "start":$("#calendar").weekCalendar("formatDate", new Date(start), "c"), 
             "end":$("#calendar").weekCalendar("formatDate", new Date(end), "c"), 
             "title":title, 
             "body":deets 
            }; 
           jsonArray[i] = jsonObj; 
          } 
          alert($.toJSON(jsonArray)); // Defined! 
          return ($.toJSON(jsonArray)); 
        } else { 
        } 
       } 
     }); 
    } 

任何想法,我在这里失踪?

+0

哇,我来了很长的路......不敢相信我在与异步斗争。哈哈! – Corey

function getEventData() { 
    function local() { 
    console.log(42); 
    return 42; 
    } 

    local(); 
} 

您错过了外部函数返回未定义的事实。这就是为什么你的答案没有定义。

你也在做异步编程错误。你想使用回调。大概有100个关于这个确切问题的重复问题。

+0

你非常有帮助!谢谢。实现我的异步错误并使用回调! http://*.com/questions/2195161/how-to-return-an-array-from-jquery-ajax-success-function-properly – Corey

您的getEventData()函数不会返回任何内容。

您正在从异步调用的回调函数返回JSON对象。您对$ .ajax的调用不返回任何内容,它只是开始后台XMLHttpRequest,然后立即返回。当请求完成时,如果HTTP请求成功,它将调用success函数。成功函数返回到$ .ajax的内部代码,而不是到您最初称为$ .ajax的函数。

+0

杜!谢谢。现在解决这个问题。 – Corey

我解决了这个问题,因为AJAX毕竟是回调。一旦检索到数据,它将被分配给回调中的全局变量,并使用全局变量(数据)刷新日历。

$(document).ready(function() { 

    // Declare variables 
    var $calendar = $('#calendar'); 
    datas = ""; 
    set = 0; 

    // Retrieves event data 
    var events = { 
     getEvents : function(callback) { 
      var dataString = "minDate="+ minDate/1000 + "&maxDate=" + maxDate/1000; 
      $.ajax({ 
       type: "POST", 
       url: "busker_ops.php", 
       data: dataString, 
       dataType: "json", 
       success: function(data) { 
        if(data != null) { 
          var jsonArray = new Array(); 
          var jsonObj = {}; 
          for(var i = data.length - 1; i >= 0; --i) { 

           var o = data[i]; 
           var set_id = o.set_id; 
           var start = o.startOrig; 
           var end = o.endOrig; 
           var title = o.title; 
           var deets = o.deets; 
           jsonObj = 
            { 
             "id":parseInt(set_id), 
             "start":$("#calendar").weekCalendar("formatDate", new Date(start), "c"), 
             "end":$("#calendar").weekCalendar("formatDate", new Date(end), "c"), 
             "title":title, 
             "body":deets 
            }; 
           jsonArray[i] = jsonObj; 
          } 
          //alert($.toJSON(jsonArray)); 
          callback.call(this,jsonArray); 
        } else { 
        } 
       } 
     }); 
     } 
    } 

    $calendar.weekCalendar({ 
     data : function(start, end, callback) { 
       if(set == 1) { 
        callback(datas); 
        //alert(datas.events); 
       } 
     } 
    }); 

    // Go get the event data 
    events.getEvents(function(evented) { 
     displayMessage("Retrieving the Lineup."); 
     datas = { 
       options : {}, 
       events : evented 
     }; 
     set = 1; 
     $calendar.weekCalendar("refresh"); 
    }); 

});