Jquery,ajax()和each(),如何等待所有信息真正加载?

时间:2010-06-06 10:55:57

标签: jquery xml ajax each

我有一个函数使用$ .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);

    }
});

我想在这种情况下数据尚未就绪? 有没有办法控制整个每个()遍历完成并准备就绪?

2 个答案:

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