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

在jquery上完成一组多个ajax请求后,如何调用函数?,jquery,ajax,Jquery,Ajax,我一次调用多个ajax请求。我有一个函数调用服务器,获取响应并处理它。根据传递给它的参数,我将决定在服务器端返回什么 我想在所有ajax请求完成后调用一个函数,因为根据不同方面,每个请求都需要不同的时间跨度 我绑定了jQuery,但立即调用.then()中的函数 以下是我尝试过的: $.when(GetAjaxData(someUrl1), GetAjaxData(someUrl2), GetAjaxData(someUrl3)).then(alert("done"), alert("not d

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

我想在所有ajax请求完成后调用一个函数,因为根据不同方面,每个请求都需要不同的时间跨度

我绑定了jQuery,但立即调用
.then()
中的函数

以下是我尝试过的:

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

有没有其他方法可以考虑?

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

大概是这样的:

function GetAjaxData(url) {
    return $.ajax({
        url: url,
        ... more options
    })
}
这将执行AJAX请求并返回jqXHR对象,该对象
jQuery。当
知道如何使用时。

鲜为人知的事实,$。如果任何一个参数失败,when()将立即执行then()回调。要引用文档,请执行以下操作:

在多次延迟的情况下,其中一个延迟被拒绝,jQuery.when会立即为其主延迟启动故障回调。请注意,某些延期可能在此时仍未解决。如果需要对这种情况执行其他处理,例如取消任何未完成的ajax请求,可以在闭包中保留对底层jqXHR对象的引用,并在failCallback中检查/取消它们

实际上,没有一种内置的方式可以等待,直到它们全部完成,而不管它们的成功/失败状态如何

因此,我为您构建了一个$.whenAll():

您想要:


您希望在
中调用函数,然后在一段时间后调用该函数??我希望在所有ajax请求返回结果并完成处理后调用该函数。通过$.ajax()的success调用的函数将负责处理:所以你的意思是说我不能将ajax调用包装到其他函数中,并在启用时调用它?不,你可以,你只需要返回jqXHR对象。请看我答案中的代码示例。您是否可以向我们展示更多代码?您使用的是最新版本的jQuery吗?我使用的是jQuery 1.5。事实上,代码中没有什么东西可以分享。。我使用一些参数调用与上述相同的函数,该函数负责发出ajax请求。正如你所提到的,我在$.ajax()中添加了一个return语句。>实际上,没有内置的方法可以等待它们全部完成,而不管它们的成功/失败状态如何。不再是这种情况(见我的答案),它注册了一个处理程序,在所有Ajax请求完成时调用它,而不仅仅是定义列表中的请求。我认为这并不能解决OP的问题
.always()
将由于
$的方式而“过早”获得。when()
工作时。它用“主承诺”包装所有请求。第二个失败,它拒绝主承诺,主承诺会立即触发所有故障回调,包括
.always()
,而不评估其余的请求。例如,如果OP的第二个请求失败,则请求3和4永远不会得到评估。说所有4个请求都已完成并非100%准确。见:
// 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") });
$(document).ajaxStop(function () {
    // or call the function which you want to call after all the ajax calls
});