2011-07-09 115 views
4

有人能告诉我为什么这个警报是空的吗?关于JavaScript可变范围的问题

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

非常感谢你的贡献!

回答

4

我认为问题是$.getJSON是一个异步调用 - 它立即返回,然后alert(pending_dates)被调用。

但是,如果发生这种情况,可能尚未收到来自异步调用的响应,因此可能尚未填充pending_dates

这可能是为什么它在调用alert(pending_dates)时为空。

-2

变量在JavaScript中是默认的全局变量 - 其实var实际上引入了范围。删除它,看看它是否有帮助。

+0

感谢您的回答,但恐怕没有用。任何其他想法? – maartenmachiels

+0

变量定义和警报在相同的范围内,所以这个建议与问题无关。 – jfriend00

-2

AJAX响应更有可能没有返回任何数据。您可以尝试将'foo'推到阵列上,并查看警报是否显示任何不同的内容?

+0

在问题中提到AJAX响应正在返回数据... – HoLyVieR

+0

这不太可能。是的,这是可能的,但所描述的问题是由于ajax调用的异步性质。 – tomfumb

3

在JSON调用完成之前,您的警报正在执行。请记住它异步获取和处理的JSON,但警报在启动后立即生效。如果你想要一个警报,那么你需要在getJSON调用完成时进行。

2

$.getJSON异步工作,这意味着无论您在回调中指定了什么,最终都会执行,但不能保证在您到达alert('pending_dates')时发生。

您可以通过后
pending_dates.push()向右移动alert('pending_dates')(这将导致一个警报显示的是检索每个项目)验证这一点。

您可以编写一个函数来开始你只要它可获取数据的工作:

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 
} 

有了这个,你就可以用你得到的,因为它的数据进行工作变得可用。