我正在使用jQuery启动多个AJAX请求,并且需要对它们进行分组,以便在批2中的请求开始之前完全执行批1中的请求。说明这一点的JSFiddle在http://jsfiddle.net/ax5mty3q/处。相关代码如下:
$(function() {
$("a").click(function() {
var deferreds = GetSomeDeferredStuff("def1");
var deferreds2 = GetSomeDeferredStuff("def2");
var base = $.when({});
base = base.then($.when.apply(null, deferreds));
// I want to stop here until def1 batch is completed
base = base.then($.when.apply(null, deferreds2).done(function() {
$("div").append("<p>All done!</p>");
}));
});
});
的问题是,第二批第一批完成之前开始。但是,目前的代码的工作方式,我得到第1批完成前第2个作业开始:
Click me!
def1: Task #1 complete.
def1: Task #2 complete.
def1: Task #3 complete.
def1: Task #4 complete.
def1: Task #5 complete.
def1: Task #6 complete.
def2: Task #1 complete.
def2: Task #2 complete.
def1: Task #7 complete.
def2: Task #3 complete.
def1: Task #8 complete.
def1: Task #9 complete.
def2: Task #4 complete.
def2: Task #5 complete.
def1: Task #10 complete.
def2: Task #6 complete.
def2: Task #7 complete.
def2: Task #8 complete.
def2: Task #9 complete.
def2: Task #10 complete.
All done!
是否有一种方法可以控制第一批次之前第二批被完全做了什么?换句话说,DEF2:任务#1应该只DEF1后出现:任务#10完成
。答案 0 :(得分:1)
仅在GetSomeDeferredStuff("def2")
内部调用base.then
。您还可以使用Promise.all
来大大简化代码,因为延后方式像Promises:
$("a").click(function() {
var deferreds = GetSomeDeferredStuff("def1");
Promise.all(deferreds)
.then(() => Promise.all(GetSomeDeferredStuff("def2")))
.then(() => {
$("div").append("<p>All done!</p>");
})
.catch((err) => {
// something went wrong, handle errors
});
});