我有一个函数使用$ .ajax()从XML文件中获取值,当加载信息并触发success事件时,我使用$(xml).find('')。each(function() {});填充一些变种......
function getData()
{
$.ajax({
type: 'GET',
url : 'info.xml',
dataType: 'xml',
success: function(xml)
{
$(xml).find('DATAS').each(function()
{
date = new Date($(this).attr('DATE'));
alert(date);
})
//Here I have a bigger find/each that should take more time
},
error: function()
{
return false;
}
});
}
在这种情况下,当我从文档就绪功能触发该功能时,警报会显示正确的数据,但如果我从该功能中删除警报并尝试此操作,则不会定义日期:
$(document).ready(function()
{
if(getData() != false)
{
alert(date);
}
});
我想在这种情况下数据尚未就绪? 有没有办法控制整个每个()遍历完成并准备就绪?
答案 0 :(得分:5)
.ajax()
启动异步请求,这意味着getData()
将立即返回。您必须对成功处理程序中的返回数据执行所有操作,或者通过添加
.ajax
请求设置为同步
$.ajax({
async: false
});
答案 1 :(得分:3)
这是因为AJAX是异步的,这意味着$.ajax()
调用在if()
完成之后才会完成... alert()
的方式只是给它时间来完成。您应该启动任何需要使用success
回调内部数据的操作,当它运行时,数据可用。像这样:
$(function() {
getDataAndDoSomething();
//other ready stuff...
});
function getDataAndDoSomething() {
$.ajax({
type: 'GET',
url : 'info.xml',
dataType: 'xml',
success: function(xml) {
$(xml).find('DATAS').each(function() {
date = new Date($(this).attr('DATE'));
alert(date);
})
//Do the other stuff depending on the date data
}
});
}