3

我有一个使用 $.ajax() 从 XML 文件中获取值的函数,当加载信息并触发成功事件时,我使用 $(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);

    }
});

我想在这种情况下数据还没有准备好?有没有办法控制整个 each() 遍历完成并准备好?

4

2 回答 2

5

.ajax()启动一个异步请求,这意味着getData()它将立即返回。您必须对成功处理程序中返回的数据执行各种操作,或者.ajax通过添加将请求设置为同步

$.ajax({
   async: false   
});
于 2010-06-06T11:00:19.783 回答
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
    }
  }); 
}
于 2010-06-06T10:59:40.520 回答