所有ajax完成后如何触发功能?

时间:2015-09-06 18:16:56

标签: javascript jquery ajax

ajax请求将由用户点击

启动

无法知道将发送多少请求

我试过ajaxComplete,但是它不起作用,我认为它在页面加载后无法检测到ajax。

function ajax1() {
    $.ajax({
        url: 'getCount.php',
        type: 'GET',
        dataType: 'html',
        success: function (data) {
            var count = parseInt(data);
            for (var i = 0; i < count; i++) {
                ajax2();
            }
        }
    });
}

function ajax2() {
    $.ajax({
        url: 'getCount2.php',
        type: 'GET',
        dataType: 'html',
        success: function (data) {
            var count = parseInt(data);
            for (var i = 0; i < count; i++) {
                ajax3();
            }
        }
    });
}

function ajax3() {
    $.ajax({
        url: 'ajax3.php',
        type: 'GET',
        dataType: 'html',
        success: function (data) {
            //do something
        }
    });
}
$(document).ajaxComplete(function (event, xhr, settings) {
    alert('Complete');
});

3 个答案:

答案 0 :(得分:3)

更新:非常好的读取承诺:Promises cookbook

正常的做法是使用$.ajax函数返回的promises。

更改您的功能以返回.ajax来电的结果:

function ajax1(..) { 
  return $.ajax(...)
}

然后使用$.when在所有承诺得到解决后解决新的承诺。

$.when([ajax1(), ajax2(), ajax3()]).then(function() { alert('all complete') })

然而,在更复杂的情况下(和你一样)你需要动态存储对所有promises的引用,并且只有在添加了所有promise之后才调用$.when

因此,例如,您可以创建承诺数组,一个用于ajax2次调用,另一个用于ajax3次调用。

var ajax2calls = [], ajax3calls=[]  

function ajax1() {
  return $.ajax({
    url: 'getCount.php',
    type: 'GET',
    dataType: 'html',
    success: function (data) {
        var count = parseInt(data);
        for (var i = 0; i < count; i++) {
            ajax2calls.push(ajax2());
        }

        $.when(ajax2calls).then(function() {
            $.when(ajax3calls).then(function() {
               alert('all done')
            }
        })

    }
  });
}

此外,您可能需要考虑使用Bluebird promise库,因为它提供了比常规promise / A或promise / A +更丰富的API。检查mapsettleall方法等。

答案 1 :(得分:0)

关于您的问题有一个非常相似的问题,请看一下,请:How to know when all ajax calls are complete

答案 2 :(得分:0)

我认为最有意义的方法是进行嵌套回调。这样一切都在回调中发生,没有任何事情发生,直到他们都完成。这些问题可能有助wait for a jquery ajax callback from calling function