我正在尝试使用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 {
}
}
});
}
知道我在这里缺少什么吗?
答案 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");
});
});