我目前正试图通过重构它来使用async: false
来放弃AJAX已弃用的$.when(...).done(...)
选项。到目前为止,结构看起来像这样:
$.when($(...).each(function() {
$.when($.ajax({
...
}),$.ajax({
...
}),$.ajax({
...
})).done(function() { //function A
// run as soon as all three AJAX requests in this loop are finished
});
})).done(function() { //function B
// run as soon as $.when().done() of each loop is finished
});
所以基本上我想要一个.each()
- 循环,它在所有请求完成后异步运行三个独立的AJAX请求和函数A中的代码。到目前为止,这部分工作。
现在的问题是我想在.each()
- 循环完成后立即执行函数B中的代码,这意味着每个循环的所有AJAX请求和函数A应该已经执行过到达功能B.但似乎循环内的$.when(...).done(...)
本身是异步的,因此.each()
- 循环在内部$.when(...).done(...)
- 函数之前完成,过早执行函数B.有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
所以我基本上解决了这个问题:
var promises = [];
$(...).each(function() {
var deferred = $.Deferred();
promises.push(deferred.promise());
$.when($.ajax({
...
}),$.ajax({
...
}),$.ajax({
...
})).done(function() { //function A
...
deferred.resolve();
});
});
$.when.apply($, promises).done(function() { //function B
...
});
在每次迭代开始时,我正在初始化Deferred对象并将其Promise对象推送到数组中。每次传递函数A时,相应的Deferred对象都会被解析。一旦解析了数组中的每个Promise,函数B就会运行。所以基本上,一旦每次执行完成了函数A,函数B就会运行。对我来说就像是一种魅力。