jquery如何使用多个ajax调用,一个接一个地调用另一个

jquery如何使用多个ajax调用,一个接一个地调用另一个,jquery,function,get,jsonp,Jquery,Function,Get,Jsonp,我在移动应用程序中,我使用多个Ajax调用从web服务器接收数据,如下所示 function get_json() { $(document).ready(function() { $.ajax({ url: 'http://www.xxxxxxxxxxxxx', data: { name: 'xxxxxx' }, dataType: 'json

我在移动应用程序中,我使用多个Ajax调用从web服务器接收数据,如下所示

function get_json() {
    $(document).ready(function() {
        $.ajax({
            url: 'http://www.xxxxxxxxxxxxx',
            data: {
                name: 'xxxxxx'
            },
            dataType: 'jsonp',
            //jsonp: 'callback',
            //jsonpCallback: 'jsonpCallback',
            success: function(data) {
                $.each(data.posts, function(i, post) {
                    $.mobile.notesdb.transaction(function(t) {
                        t.executeSql('INSERT into bill (barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount, pastpayments, todaypayments, paydate, receiptno) VALUES (?,?,?,?,?,?,?,?,?,?,?,?);', [post.Id, post.Code, post.Address, post.Name, post.Description, post.EntrySeason, post.Period, post.Revenue, post.PastPayments, post.todaypayments, post.paydate, post.receiptno],
                        //$.mobile.changePage('#page3', 'slide', false, true),  
                        null);
                    });
                    $('#mycontent').append(post.Name);
                });
            }
        });

        $.ajax({
            xxxx
        });

        $.ajax({
            xxxx
        });
    });
}

如何强制第二个ajax调用在第一个调用结束后开始。。。第三个在第二个结束之后,继续吗?

将它们放在它所依赖的一个的
成功:

$.ajax({
    url: 'http://www.xxxxxxxxxxxxx',
    data: {name: 'xxxxxx'},
    dataType: 'jsonp',
    success: function(data){

        // do stuff

        // call next ajax function
        $.ajax({ xxx });
    }
});

将每个ajax调用包装在一个命名函数中,只需将它们添加到前一个调用的成功回调中:

function callA() {
    $.ajax({
    ...
    success: function() {
      //do stuff
      callB();
    }
    });
}

function callB() {
    $.ajax({
    ...
    success: function() {
        //do stuff
        callC();
    }
    });
}

function callC() {
    $.ajax({
    ...
    });
}


callA();

您有点接近了,但应该将函数放在
document.ready
事件处理程序中,而不是相反

另一种方法是将AJAX调用放在一个通用函数中,然后从AJAX回调调用该函数,按顺序循环一组请求:

$(function () {

    //setup an array of AJAX options,
    //each object will specify information for a single AJAX request
    var ajaxes  = [
            {
                url      : '<url>',
                data     : {...},
                callback : function (data) { /*do work on data*/ }
            },
            {
                url      : '<url2>',
                data     : {...},
                callback : function (data) { /*maybe something different (maybe not)*/ }
            }
        ],
        current = 0;

    //declare your function to run AJAX requests
    function do_ajax() {

        //check to make sure there are more requests to make
        if (current < ajaxes.length) {

            //make the AJAX request with the given info from the array of objects
            $.ajax({
                url      : ajaxes[current].url,
                data     : ajaxes[current].data,
                success  : function (serverResponse) {

                    //once a successful response has been received,
                    //no HTTP error or timeout reached,
                    //run the callback for this request
                    ajaxes[current].callback(serverResponse);

                },
                complete : function () {

                    //increment the `current` counter
                    //and recursively call our do_ajax() function again.
                    current++;
                    do_ajax();

                    //note that the "success" callback will fire
                    //before the "complete" callback

                }
            });
        }
    }

    //run the AJAX function for the first time once `document.ready` fires
    do_ajax();

});
$(函数(){
//设置一组AJAX选项,
//每个对象将为单个AJAX请求指定信息
变量ajaxes=[
{
url:“”,
数据:{…},
回调:函数(数据){/*处理数据*/}
},
{
url:“”,
数据:{…},
回调:函数(数据){/*可能是不同的(可能不是)*/}
}
],
电流=0;
//声明函数以运行AJAX请求
函数do_ajax(){
//检查以确保有更多的请求要提出
if(电流<轴长度){
//使用对象数组中的给定信息发出AJAX请求
$.ajax({
url:ajaxes[current].url,
数据:ajaxes[当前]。数据,
成功:函数(serverResponse){
//一旦收到成功的回复,
//未达到HTTP错误或超时,
//为此请求运行回调
ajaxes[current]。回调(serverResponse);
},
完成:函数(){
//递增“当前”计数器
//然后再次递归调用do_ajax()函数。
电流++;
dou_ajax();
//请注意,“success”回调将启动
//在“完成”回调之前
}
});
}
}
//一旦“document.ready”触发,第一次运行AJAX函数
dou_ajax();
});
在本例中,运行下一个AJAX请求的递归调用被设置为
complete
回调,这样无论当前响应的状态如何,它都会运行。这意味着,如果请求超时或返回HTTP错误(或无效响应),下一个请求仍将运行。如果您要求后续请求仅在请求成功时运行,那么使用
success
回调进行递归调用可能是最好的选择


更新了2018-08-21关于评论中的优点。

您还可以使用jquery when和then函数。比如说

$(document).ready(function(){
 $('#category').change(function(){  
  $("#app").fadeOut();
$.ajax({
type: "POST",
url: "themes/ajax.php",
data: "cat="+$(this).val(),
cache: false,
success: function(msg)
    {
    $('#app').fadeIn().html(msg);
    $('#app').change(function(){    
    $("#store").fadeOut();
        $.ajax({
        type: "POST",
        url: "themes/ajax.php",
        data: "app="+$(this).val(),
        cache: false,
        success: function(ms)
            {
            $('#store').fadeIn().html(ms);

            }
            });// second ajAx
        });// second on change


     }// first  ajAx sucess
  });// firs ajAx
 });// firs on change

});
 $.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
  //another ajax call
});

< P> <强>我认为以下是更实用的,因为它不重写Ajax调用,但这无疑是一个味觉的问题。<强> < /P>
function check_ajax_call_count()
{
    if ( window.ajax_call_count==window.ajax_calls_completed )
    {
        // do whatever needs to be done after the last ajax call finished
    }
}
window.ajax_call_count = 0;
window.ajax_calls_completed = 10;
setInterval(check_ajax_call_count,100);

现在,您可以在ajax请求的成功部分内迭代window.ajax\u call\u计数,直到达到指定的发送调用数(window.ajax\u calls\u completed).

这是我使用了一段时间的最优雅的解决方案。它不需要外部计数器变量,并且提供了良好的封装程度

var urls = ['http://..', 'http://..', ..];

function ajaxRequest (urls) {
    if (urls.length > 0) {
        $.ajax({
            method: 'GET',
            url: urls.pop()
        })
        .done(function (result)) {
            ajaxRequest(urls);
        });
    }
}

ajaxRequest(urls); 
我们可以简单地使用

async: false 

这可以满足您的需要。

还没有尝试过,但是如果ajax调用的次数太多,这是我能想到的最好的方法

方法1:

let ajax1= $.ajax({url:'', type:'', . . .});
let ajax2= $.ajax({url:'', type:'', . . .});
.
.
.
let ajaxList = [ajax1, ajax2, . . .]

let count = 0;
let executeAjax = (i) => {
   $.when(ajaxList[i]).done((data) => {
      //  dataOperations goes here
      return i++
   })
}
while (count< ajaxList.length) {
   count = executeAjax(count)
}
$.when(ajax1).done((data1) => {
      //  dataOperations goes here on data1
      $.when(ajax2).done((data2) => {
         //  Here you can utilize data1 and data 2 simultaneously 
         . . . and so on
      })
   })

注意:如果是重复性任务,请选择方法1,如果每个数据都要以不同的方式处理,那么方法2中的嵌套更有意义。

我该如何做到这一点?您能解释多级别
$的itRepeat吗。ajax()
调用。您可以对未知数量的AJAX请求递归执行此操作。目前有几个问题的答案可以证明这一点。递归肯定是一条路要走。。。假设他每次都打同样的电话。“我只是不这么认为。”蒂莫西——如果我把写作当作一种普通的方法的话。我该怎么称呼这种情况呢?唯一有关这一点的是,失败的AJAX调用将导致没有其他AJAX调用(因为没有“如果AJAX调用失败就这样做”,它将永远等待“成功”)。也许这正是你想要的。。。有点值得考虑。我认为你最好用$。当As @里昂建议。如何写4级层次?神圣Ajax,蝙蝠侠!对于OP的需求来说,这无疑是一个过于复杂的问题@里昂的答案要好得多。另外,如果你想忽略错误,你可以在那里做一个
complete:function(){current++;do_ajax();}
。)为什么会有这么多选票?这是一个“递归”AJAX回调的示例。OP询问的是“连续”回调。。。显式不调用同一个函数。这会使函数名产生误导:callA不仅是callA,而且callB&CcallA可以是callABC和callB->calBC,但这只有在成功时才有意义。不过,对于小代码来说,这似乎是一个简单的解决方案,而且比公认的答案更直截了当。不,这是你能做的最糟糕的事情,因为它会挂起你的浏览器,直到ajax请求没有完成。从jQuery 1.8开始,使用async:false和jqXHR($.Deferred)是不推荐的。如果每个调用除了URL之外都是相同的,这是很好的。如果Ajax调用涉及不同的方法、返回处理和/或要发送的不同数据,那么它将变得非常不雅观。在这种情况下,上面Skyler的解决方案将更加清晰。这是一个基本示例,但您可以定义方法,ret