如何在jquery上完成一组多个ajax请求后调用一个函数?

时间:2011-03-07 19:20:29

标签: jquery ajax

我一次调用多个ajax请求。我有一个函数调用服务器并获取响应并处理它。根据传递给它的参数,我将决定在服务器端返回什么。

我希望在完成所有ajax请求后调用一个函数,因为每个请求都需要不同的时间跨度,具体取决于各个方面。

我绑定了jQuery http://api.jquery.com/jQuery.when/但是.then()中的函数会被立即调用。

以下是我的尝试:

$.when(GetAjaxData(someUrl1), GetAjaxData(someUrl2), GetAjaxData(someUrl3)).then(alert("done"), alert("not done"));

你能想到其他任何方法吗?

4 个答案:

答案 0 :(得分:2)

鲜为人知的事实是,如果任何一个参数失败,$ .when()会立即执行then()回调。引用文档:

http://api.jquery.com/jQuery.when/

  

在多个Deferreds案例中,其中一个Deferreds被拒绝,jQuery.when立即触发其主Deferred的failCallbacks。请注意,此时某些延迟可能仍未解决。如果您需要为此情况执行其他处理,例如取消任何未完成的ajax请求,则可以在闭包中保留对基础jqXHR对象的引用,并在failCallback中检查/取消它们。

实际上没有内置的等待方式,直到所有这些方式都完成,无论其成功/失败状态如何。

所以,我为你建了一个$ .whenAll():)

http://jsfiddle.net/InfinitiesLoop/yQsYK/

答案 1 :(得分:0)

jQuery.when仅在返回jQuery.Deferred对象时有效,因此在GetAjaxData函数中,您希望返回jqXHR对象(延迟)。

这样的事情:

function GetAjaxData(url) {
    return $.ajax({
        url: url,
        ... more options
    })
}

这将执行AJAX请求并返回jQuery.when知道如何使用的jqXHR对象。

答案 2 :(得分:0)

您想要deferred.always()

// Called when all deferreds are either resolved or rejected
$.when(
    $.ajax("/page1.php"),
    $.ajax("/page2.php"),
    $.ajax("/page3.php"))
.always(function() { alert("AJAX requests completed") });

答案 3 :(得分:0)

$(document).ajaxStop(function () {
    // or call the function which you want to call after all the ajax calls
});