Próbuję zwrócić obiekt JSON z funkcji za pomocą wtyczki JSON JQUERY (http: / /code.google.com/p/jquery-json/) ale po powrocie obiektu z funkcji staje się niezdefiniowany.

$(document).ready(function() {

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

    $calendar.weekCalendar({

        ...

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

Jeśli sprawdzę obiekt przed powrotem, jest zdefiniowany.

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 {
                    }
                }
        });
    }

Masz pojęcie, czego tu brakuje?

1
Corey Gwin 20 listopad 2011, 05:55

3 odpowiedzi

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

  local();
}

TWOJE brakuje faktu, że funkcja zewnętrzna zwraca niezdefiniowane. I dlatego twoja odpowiedź jest niezdefiniowana.

TWO także robię asynchroniczne programowanie źle. Chcesz użyć zwrotów zwrotnych. Prawdopodobnie istnieje 100 suplicznych pytań dotyczących tego dokładnego problemu.

2
Raynos 20 listopad 2011, 01:58

Twoja funkcja GetEventData () nic nie zwraca.

Wracasz obiekt JSON z funkcji wywołania zwrotnego, które nazywane asynchronicznie. Twoje połączenie do $ Gdy żądanie zakończy się, zadzwoni do funkcji success, jeśli żądanie HTTP zakończyło się powodzeniem. Funkcja sukcesu powraca do wewnętrznego kodu w $ .ajax, nie do swojej funkcji, która pierwotnie nazywana $ .ajax.

1
Jason LeBrun 20 listopad 2011, 01:59

Rozwiązałem to za pomocą zwrotów zwrotnych, ponieważ przecież AJAX. Po pobraniu danych jest przypisany do zmiennej globalnej w oddzwonieniu, a kalendarz jest odświeżony przy użyciu zmiennej globalnej (DATA).

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

});
0
Corey Gwin 22 listopad 2011, 04:30