等到所有jQuery Ajax请求都完成吗?
如何让一个函数等到所有jQuery Ajax请求都在另一个函数内完成?
简而言之,我需要等待所有Ajax请求完成,然后再执行下一个请求。但是如何做到呢?
如何让一个函数等到所有jQuery Ajax请求都在另一个函数内完成?
简而言之,我需要等待所有Ajax请求完成,然后再执行下一个请求。但是如何做到呢?
jQuery 现在为此定义了一个 when 函数。
它接受任意数量的延迟对象作为参数,并在所有对象解析时执行函数。
这意味着,如果你想发起(例如)四个ajax请求,然后在它们完成后执行一个操作,你可以做这样的事情:
$.when(ajax1(), ajax2(), ajax3(), ajax4()).done(function(a1, a2, a3, a4){
// the code here will be executed when all four ajax requests resolve.
// a1, a2, a3 and a4 are lists of length 3 containing the response text,
// status, and jqXHR object for each of the four ajax calls respectively.
});
function ajax1() {
// NOTE: This function must return the value
// from calling the $.ajax() method.
return $.ajax({
url: "someUrl",
dataType: "json",
data: yourJsonData,
...
});
}
在我看来,它使语法干净明了,并避免涉及任何全局变量,如ajaxStart和ajaxStop,随着页面的发展,这些变量可能会产生不必要的副作用。
如果你事先不知道你需要等待多少个ajax参数(即你想使用可变数量的参数),它仍然可以完成,但只是有点棘手。请参阅将延迟数组传递到 $.when() (以及可能使用可变数量的参数进行故障排除时的 jQuery .)。
如果您需要更深入地控制ajax脚本等的故障模式,则可以保存返回的对象 - 它是一个包含所有原始ajax查询的jQuery Promise对象。您可以调用 或 它来添加详细的成功/失败处理程序。.when()
.then()
.fail()
如果您想知道文档中所有请求何时完成,无论其中有多少个请求都存在,只需按以下方式使用 $.ajaxStop
事件:ajax
$(document).ajaxStop(function () {
// 0 === $.active
});
在这种情况下,您既不需要猜测应用程序中发生了多少请求(将来可能会完成),也不需要深入研究复杂的逻辑函数或查找哪些函数正在执行请求。
HTTP(S)
此处的 $.ajaxStop
也可以绑定到您认为可能被 requst 修改的任何节点。HTML
更新:
如果你想坚持语法,那么你可以使用Promise.all
的已知方法:ES
ajax
Promise.all([ajax1(), ajax2()]).then(() => {
// all requests finished successfully
}).catch(() => {
// all requests finished but one or more failed
})
这里有一个有趣的观点是,它既可以与请求一起使用,也可以与请求一起使用。Promises
$.ajax
这是jsFiddle演示。
更新 2:
使用异步/等待语法的最新版本:
try {
const results = await Promise.all([ajax1(), ajax2()])
// do other actions
} catch(ex) { }