【问题标题】:Javascript Function Returns Undefined JSON Object (But It's Not Undefined!)Javascript 函数返回未定义的 JSON 对象(但它不是未定义的!)
【发布时间】:2012-01-02 04:30:09
【问题描述】:

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

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

【问题讨论】:

  • 哇,我已经走了很长一段路……不敢相信我正在与异步作斗争。哈哈!

标签: javascript jquery json


【解决方案1】:
function getEventData() {
  function local() {
    console.log(42);
    return 42;
  }

  local();
}

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 呃!谢谢。现在解决这个问题。
【解决方案3】:

我通过使用回调解决了这个问题,毕竟 AJAX 是。检索到数据后,将其分配给回调中的全局变量,并使用全局变量 (datas) 刷新日历。

$(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");
    });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多