我有一个点击事件,可以触发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调用已被解雇?
提前致谢!
答案 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
来检查它们何时被设置,但这太可怕了。