分组的jQuery Ajax请求强制执行顺序

时间:2019-02-02 19:49:35

标签: jquery ajax promise

我正在使用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完成

1 个答案:

答案 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
    });
});
相关问题