通过更新延迟内部then()延迟链接jQuery?

时间:2017-03-07 09:50:32

标签: javascript jquery ajax deferred chaining

我正在学习使用jQuery Deferred,我正在考虑链接多个延迟。这是我的问题的简化版本:

var def1 = $.ajax(...); // ajax call 1
var def2 = null, def3 = null;

$.when(def1)
  .then(function() {
    def2 = $.ajax(...); // ajax call 2
    return def2;
  }).then(function() {
    def3 = $.ajax(...); // ajax call 3
    return def3;
  });

然后在上面代码的下方,我有:

$.when(def1, def2, def3)
  .then(function() {
    // run some code... .e.g. run foo();
  });

上面的代码错了。它不能做我想做的事。我的实际意图基本上是:

我想首先运行ajax call 1。

如果ajax调用1成功,则运行ajax调用2.(将添加奖励:如果ajax调用1未成功和/或其返回的结果未通过我的手动验证,请提醒用户并运行一些代码,例如bar()。)

如果ajax call 2成功,则运行ajax call 3.(同样的奖励适用)

然后我想在def3解析后运行一些代码(例如foo())。在运行foo()之前,我并不关心def1和def2是否已经解决。 (如果def3被拒绝,我也想运行另一段代码,如果可能的话。)

我无法在开头初始化def2(ajax call 2)和def3(ajax call 3)的原因是我想修改ajax call 2的选项,具体取决于ajax call 1的返回结果.ajax调用3的方式相同,具体取决于ajax调用2的结果。

由于我对延迟的知识和理解有限,上述代码基本上无法产生我想要的东西。

因为在初始化和触发def2之前解析了def1,所以底层代码将在启动def2之前很快运行foo()...

所以,我正在寻求帮助和建议。看看是否有人知道如何重写上面的代码并让它像我上面写的那样运行。我很抱歉我无能为力。

提前谢谢大家。

1 个答案:

答案 0 :(得分:1)

您不需要使用when,当您想并行运行多个延迟时,最好使用var d1 = $.ajax(...); var d2 = d1.then(function () { if (invalid) { return $.Deferred().reject("Invalid"); } return $.ajax(...); }); var d3 = d2.then(function () { if (invalid) { return $.Deferred().reject("Invalid"); } return $.ajax(...); }); d3.done(function () { // This is called when we're all done. }); 。试试这个:

$.ajax(...).then(function () {
  if (invalid) {
    return $.Deferred().reject("Invalid");
  }
  return $.ajax(...);
}).then(function () {
  if (invalid) {
    return $.Deferred().reject("Invalid");
  }
  return $.ajax(...);
}).done(function () {
  // This is called when we're all done.
})
// Use this to handle failure. You can also add to individual
// deferred objects to handle each failure differently.
.fail(function () {
  // Do something.
});

可以简化为:

then

要处理失败,您可能需要在.then(function () { if (invalid) { return $.Deferred().reject("Invalid"); } // Do stuff }, function (err) { })

中添加另一个回调
    PaginationModule.forRoot(),