所有ajax调用完成后的事件

时间:2016-03-10 01:19:37

标签: javascript jquery ajax events

我有一个点击事件,可以触发3个ajax调用:

$("#button").click(function(e) {
    e.preventDefault();

    $.ajax(call1);
    $.ajax(call2);
    $.ajax(call3);

    some_function() //should fire off AFTER all ajax calls are complete
});

在解雇我的some_function()函数之前,有没有办法让我确认所有ajax调用已被解雇?

提前致谢!

3 个答案:

答案 0 :(得分:2)

您可以使用$.when

  

提供一种基于一个或多个对象执行回调函数的方法,通常是表示异步事件的Deferred对象。

$.when($.ajax(call1), $.ajax(call2), $.ajax(call3))
.done(function () {
     some_function();
});

如果(出于某种原因)你有一系列承诺,那么你可以使用Function.prototype.apply()来调用这个方法:

$.when.apply($, ajaxArray)
.done(function () {
   some_function();
});

答案 1 :(得分:1)

我建议你使用async: false并将$.ajax放在另一个ajax中,有点像这样......

$.ajax({
    async: false,
    // ...
    complete: function() {
        $.ajax({ // second ajax
            async: false,
            // ...
            complete: function() {
                $.ajax({ // second ajax
                    async: false,
                    // ...
                    complete: function() {
                         some_function();
                    }
                });
            }
        });
    }
});

答案 2 :(得分:0)

这取决于您是否需要成功回复,但请考虑以下因素:

$.ajax({
    url: "http://some.url.example.com/endpoint",
})
.always(function (data){
    // Process the data
    $.ajax({
        url: "http://some.url.example.com/endpoint2",
    })
    .always(function (data2){
        // Process the data
        $.ajax({
            url: "http://some.url.example.com/endpoint3",
        })
        .always(function (data) {
            someFunction();
        });
    });
});

关于jQuery延迟对象和ES6 Promises,可以做更多的阅读。

如果您希望设置超时并且不关心结果,请设置超时选项`$ .ajax({url:" http://some.url.example.com/endpoint",超时:500 })

OR

在每个变量中设置一个变量并使用window.setTimeout来检查它们何时被设置,但这太可怕了。