【问题标题】:what is the difference between these pattern of jquery defered call?这些jquery延迟调用模式有什么区别?
【发布时间】:2017-11-11 02:09:12
【问题描述】:

我正在尝试调用一些这样的异步函数。为什么案例 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
})    

这种情况下fail刚开始执行,always部分不等待就直接执行。

案例 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部分作为fail部分,在then完成后始终可以运行。

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

【问题讨论】:

  • firstCall() 返回什么?什么版本的jQuery?

标签: jquery jquery-deferred deferred


【解决方案1】:

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


案例A

"...always 部分无需等待即可执行。"

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

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

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

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

幸运的是,.then() 就是为了这个目的而存在的! 但在案例 C 中会有更多信息......


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

.done().fail()相反的。对于任何单个延迟对象,只有其中一个会触发,具体取决于它是成功还是失败。

deferred.done()

添加要在延迟对象解析时调用的处理程序。

deferred.fail()

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


案例 C

.then()

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

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

但是有一个主要区别:

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

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


总结:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2014-06-22
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多