有人可以告诉我为什么这个警报是空的吗?
var pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
$.each(data, function(key, val) {
pending_dates.push({'event_date' : val.event_date});
});
});
alert(pending_dates);
我无法理解这一点。我不是将pending_dates
声明为全局变量,可以在每个循环中访问吗?如何解决这个问题?
请注意,JSON输出效果很好。如果我在getJSON function
内声明待定日期(以及该函数中的警报),它可以工作,但我需要将数据存储在getJSON
函数之外的数组中。
感谢您的贡献。
修改的
感谢您的评论,此代码正在运行:
pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
$.each(data, function(key, val) {
pending_dates.push({'event_date' : val.event_date});
});
}).success(function() { alert(pending_dates); })
非常感谢您的贡献!
答案 0 :(得分:4)
我认为问题是$.getJSON
是异步调用 - 它立即返回,然后调用alert(pending_dates)
。
然而,当发生这种情况时,可能没有收到异步调用的响应,因此可能没有填充pending_dates
。
这可能是为什么在调用alert(pending_dates)
时它为空的原因。
答案 1 :(得分:3)
在JSON调用完成之前,您的警报正在执行。记住它以异步方式获取和处理的这个JSON,但是在它启动后立即发出警报。如果你想要一个警报,那么你需要把它放在getJSON调用完成时。
答案 2 :(得分:2)
$.getJSON
异步工作意味着您在回调中指定的任何内容最终都会被执行,但无法保证在您到达alert('pending_dates')
时会发生。
您可以在左后方移动alert('pending_dates')
来验证这一点
pending_dates.push()
(这会导致为其检索的每个项目显示一条警报。)
您可以编写一个函数,以便在可用时立即开始处理您正在检索的数据:
var pending_dates = [];
$.getJSON('/ajax/event-json-output.php', function(data) {
$.each(data, function(key, val) {
pending_dates.push({'event_date' : val.event_date});
doSomething(val.event_date);
});
});
function doSomething(date) {
// do something with date
// like writing it to the page
// or displaying an alert
}
通过这种方式,您将能够处理所有可用的数据。
答案 3 :(得分:-2)
默认情况下,变量在Javascript中是全局的 - var
实际上引入了范围。删除它,看看它是否有帮助。
答案 4 :(得分:-2)
AJAX响应更有可能不返回任何数据。您是否可以尝试仅将'foo'
推送到阵列上,并查看警报是否显示不同的内容?