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

时间:2011-11-20 01:55:08

标签: javascript jquery json

我正在尝试使用JSON jQuery插件(http://code.google.com/p/jquery-json/))从函数返回一个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 {
                    }
                }
        });
    }

知道我在这里缺少什么吗?

3 个答案:

答案 0 :(得分:2)

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

  local();
}

你错过了外部函数返回undefined的事实。这就是为什么你的答案是不确定的。

你的异步编程也错了。你想使用回调。关于这个确切的问题可能有100多个重复的问题。

答案 1 :(得分:1)

你的getEventData()函数什么都不返回。

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

答案 2 :(得分:0)

我通过使用回调来解决这个问题,因为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");
    });

});