$(document).ready和xhr

时间:2012-03-17 10:35:22

标签: jquery xmlhttprequest document-ready

我使用jquery进行编码。我的问题是$(document).ready(function()调用两个执行xhr请求的函数

<script type="text/javascript">
$(document).ready(function() {
getIdCategories();
getnameCategories();
});
</script>

有时候没有任何功能可行,有时功能有效,但它们不按顺序工作!!

拖曳功能:

function getIdCategories()
{

    var request = new XMLHttpRequest();

    request.open("GET","http://patisserie-orient.fr/prestashop/prestashop/api/categories?PHP_AUTH_USER="+PHP_AUTH_USER+"&ws_key="+ws_key,true);
    request.onreadystatechange = function()
    {
        if(request.readyState==4)
        {
            //alert("Status is:  "+request.status);
            if (request.status == 200 || request.status == 0)
            {
                response  = request.responseXML.documentElement;
                i=0;
                while(response.getElementsByTagName('category')[i]!=undefined)
                    {
                        idCategories[i]=response.getElementsByTagName('category')[i].getAttribute('id') ;
                        //alert(idCategories[i]);
                        i=i+1;
                    }

             }
         }

    }
    request.send();
}

function getnameCategories()
{

    var request = new XMLHttpRequest();
    if(i<idCategories.length)
        {
            request.open("GET","http://patisserie-orient.fr/prestashop/prestashop/api/categories/"+idCategories[i]+"?PHP_AUTH_USER="+PHP_AUTH_USER+"&ws_key="+ws_key,true);

            request.onreadystatechange = function()
                {
                    if(request.readyState==4)
                    {
                        //alert("Status2 is  "+request.status);
                        if (request.status == 200 || request.status == 0)
                        {
                            response1  = request.responseXML.documentElement;
                            nameCategories[i] = response1.getElementsByTagName('language')[0].firstChild.data;
                            //alert(nameCategories[i]);
                            $('#im'+i).html(nameCategories[i]);
                            $('#a'+i).show();
                            i++;


                         }
                     }
                }

            request.send();

        }   
    else
        {
            return;
        }

}

3 个答案:

答案 0 :(得分:2)

查看$.ajaxhttp://api.jquery.com/jQuery.ajax/

这比原生方式容易得多。

AJAX意味着 异步 JavaScript和XML ,其中异步意味着脚本不会等到请求完成。这意味着您的两个请求同时开始,您无法知道哪一个更快。但是你可以从第一个请求开始回调函数中的第二个请求,所以第二个请求在第一个请求完成时开始。

$(function(){
    $.ajax({
        type: 'GET',
        url: '',
        data: {},
        success:function(data){
            console.log('First request done');
            /* Start second request HERE */
        }

    });
});

$.ajax还提供同步请求。对于同步请求,脚本会等待请求完成:

$(function(){
    $.ajax({
        type: 'GET',
        url: '',
        data: {},
        async: false
    });
    console.log('First request done');
    /*Start second request HERE */
});

答案 1 :(得分:1)

Ajax来电只是async请求,这意味着您无法控制先完成哪一个订单。但你仍然可以通过添加另一个callback来解决它。

$(document).ready(function() {
    getIdCategories(function(){
        getnameCategories();
    }); 
});

// in 'getIdCategories'
function getIdCategories(cb) {
    if (/* ajax complete */) {
        // fire callback function
        cb && cb();
    }
}

答案 2 :(得分:0)

jQuery的AJAX函数有一个名为async的参数,您可以将其设置为false以强制执行同步行为

$(function(){
$.ajax({
    type: 'GET',
    url: '',
    async: false,
    data: {},
    success:function(data){
        console.log('First request done');
        /* Start second request HERE */
    }

});

});

//调用另一个ajax函数

这应该允许你控制执行的顺序..除非第一次调用返回第二次不会启动