【问题标题】:how to call a function after a set of multiple ajax request complete on jquery?在jquery上完成一组多个ajax请求后如何调用函数?
【发布时间】:2016-01-29 18:52:46
【问题描述】:

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

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

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

这是我尝试过的:

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

还有其他你能想到的方法吗?

【问题讨论】:

  • 你想在一段时间后调用then中的函数??
  • 我想在所有 ajax 请求都返回结果并且处理完成后调用该函数。处理将在通过 $.ajax() 成功调用的函数中进行处理:

标签: jquery ajax


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • > 实际上没有内置的方法可以等待它们全部完成,而不管它们的成功/失败状态如何。不再是这种情况(见我的回答)
【解决方案2】:

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

类似这样的:

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

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

【讨论】:

  • 所以你的意思是说我不能将 ajax 调用包装在其他一些函数中并在打开时调用是吗?
  • 不,你可以,你只需要返回jqXHR对象。请参阅我的答案中的代码示例。
  • 还有更多的代码可以给我们看吗?您使用的是最新版本的 jQuery 吗?
  • 我正在使用 jquery 1.5。实际上,代码中没有什么可以共享的。我正在调用与上面提到的相同的函数,并带有一些参数,并且该函数负责发出 ajax 请求。正如你所提到的,我在 $.ajax() 中添加了一个 return 语句。
【解决方案3】:

你想要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") });

【讨论】:

  • 我认为这不能解决 OP 的问题。由于$.when() 的工作方式,.always() 将“过早地”获得。它用“主承诺”包装所有请求。其中第二个失败,它拒绝了立即触发所有失败回调的主承诺,其中包括.always(),而不评估剩余的请求。例如,如果 OP 的第二个请求失败,则不会对请求 3 和 4 进行评估。说所有 4 个请求都已完成并不是 100% 准确的。见:stackoverflow.com/questions/19177087/…
【解决方案4】:
$(document).ajaxStop(function () {
    // or call the function which you want to call after all the ajax calls
}); 

【讨论】:

  • 这会注册一个处理程序,当所有 Ajax 请求完成时调用,而不仅仅是定义列表中的那些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多