【问题标题】:Grouping jQuery AJAX requests to enforce order对 jQuery AJAX 请求进行分组以强制执行顺序
【发布时间】:2019-02-03 03:53:54
【问题描述】:

我正在使用 jQuery 启动多个 AJAX 请求,并且需要对它们进行分组,以便 Batch 1 的请求在 Batch 2 开始之前完全执行。说明这一点的 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: Task #1 应该只在 def1: Task #10 完成后出现。

【问题讨论】:

    标签: jquery ajax promise


    【解决方案1】:

    仅在base.then 内调用GetSomeDeferredStuff("def2")。您也可以改用Promise.all 来大大简化代码,因为 deferred 就像 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
        });
    });
    

    【讨论】:

    • 这很漂亮,谢谢!只要允许,我就会接受您的回答。我试图坚持使用 jQuery 延迟函数,但没有理由这样做,这就像宣传的那样。
    • 顺便说一句,我确实尝试在 base.then 中使用 GetSomeDeferredStuff("def2") 并没有解决问题。使用 Promise.all 就是诀窍。
    • 应该澄清一下,我的意思是在 .then,例如base.then(() =&gt; { var deferreds2 = ... $.when.apply(null, deferreds2).done(() {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多