我试图像这样调用一些异步函数。为什么在案例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
完成后运行。
我不确定为什么会发生这种情况。有人可以进一步解释一下吗?感谢
答案 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 }}