延迟jQuery:使用条件创建链序列

时间:2017-02-21 20:48:29

标签: javascript jquery asynchronous deferred

我发现自己处于以下情况。我需要进行3次异步调用:call2仅在call1完成时触发,call3仅在call2完成时触发(我还需要使用jQuery中的deferred对象)。

function call1() {
   return $.ajax(...);
}

function call2() {
   return $.ajax(...);
}

function call3() {
   return $.ajax(...);
}

此时没有什么复杂的,我可以使用then()函数。

call1().then(call2).then(call3)

问题是有2个条件(cond2和cond3)将决定是否进行call2和call3。如果我用伪代码描述它,它将如下所示:

if cond2
  if cond3
    call1().then(call2).then(call3)
  else
    call1().then(call2)
else
  if cond3
    call1().then(call3)
  else
    call1()

我知道我可以通过编写一个使用这种结构的程序来解决我的问题,但它似乎并不合适。

我的问题是,如何通过使用jQuery中的延迟对象以有效的方式解决这个问题? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

这可能就是你要找的东西:

var chain = call1();
if (cond2) chain = chain.then(call2);
if (cond3) chain = chain.then(call3);
return chain;

答案 1 :(得分:2)

你可以这样做:

call1().then(cond2 ? call2 : null).then(cond3 ? call3 : null);

非函数null将返回承诺的值,因此链中的下一个then回调仍将获得承诺的值。