这些jquery deferred call之间的区别是什么?

时间:2017-11-11 02:09:12

标签: jquery jquery-deferred deferred

我试图像这样调用一些异步函数。为什么在案例A和案例B中我失败但在案例C中成功?

案例A

firstCall()// try to get esstential parameters(a defered)
.fail(function(){
   //failed :call login function again wait user to input login credential(also a defered)
})
.always(function() {
    //show welcome message
})    

在这种情况下,当失败刚开始执行时,始终只是执行而不等待。

案例B

firstCall()// try to get esstential parameters(a defered)
.fail(function(){
    //failed :call login function again wait user to input login 
})
.done(function() {
    //show welcome message
})

在这种情况下,如果失败部分被执行,但完成的部分永远不会被执行。

案例C

firstCall()// try to get esstential parameters(a defered)
.then(null,function(){
     //failed :call login function again wait user to input login 
})
.always(function() {
    //show welcome message
})

在这种情况下,then部分充当失败部分,并且始终可以在then完成后运行。

我不确定为什么会发生这种情况。有人可以进一步解释一下吗?感谢

1 个答案:

答案 0 :(得分:0)

此答案中的所有外部引号均来自jQuery Deferred Object documentation或其中链接的相应方法文档。

案例A

  

“......总是在不等待的情况下执行。

让我们来看看.fail()的文档:

  

... deferred.fail()返回延迟对象,延迟对象的其他方法可以链接到这个...

.fail()方法返回原始延迟对象,而不是打开新的承诺。这意味着任何链接到它的事件,虽然它们将按顺序运行,但并不固有地等待先前的事件完成。您的.fail()将不会被等待,但会立即执行

你想要附加的任何回调方法都必须链接到内部函数,创建一个延迟对象的嵌套循环 - 你可以想象如果我们开始深入了三到四次回调就会变得多么丑陋。

幸运的是, .then()出于此目的存在! 但在案例C中有更多内容......

案例B - “在这种情况下,如果失败部分被执行,但完成的部分永远不会被执行。”

.done().fail()对立面。根据成功或失败的对象,只有其中一个会触发任何一个延迟对象。

  

<强> deferred.done()

     

添加要在Deferred对象已解决时调用的处理程序。

  

<强> deferred.fail()

     

添加要在Deferred对象被拒绝时调用的处理程序。

CASE C

  

<强> .then()

     

当Deferred对象已解决已拒绝仍在进行中时,添加要调用的处理程序。

.then().fail()都处理被拒绝的延迟对象。

然而,有一个重大区别:

  

从jQuery 1.8开始deferred.then()方法会返回一个新的承诺......

.then() 会返回新承诺 ,而.fail() 则不会。这意味着链接到.then()方法的任何方法都将像原始延迟对象一样等待它的完成。

<强>要点:

如果您尝试拨打顺序等待的电话,请使用.then()。这将允许您作为一系列新承诺在链中前进,同时保持原始延迟对象的状态和值。

如果您已完成顺序调用并准备“关闭”延迟对象,请使用返回延迟对象的方法,例如.done().fail()或{{1 }}