2017-11-11 92 views
2

我想调用一些像这样的异步函数。为什么在案例A和案例B中我失败了,但是在案例C中成功了?这些模式jquery守护呼叫有什么区别?

情况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

是什么'新华美通()'返回?什么版本的jQuery? – charlietfl

回答

0

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


CASE一个

“......始终只是部分执行,而无需等待。

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

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

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

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

幸运的是,.then()存在这个确切的目的!但更多的情况下,在案例C ...


情况B - “在这种情况下,如果失败,部分得到执行,但做部分从未得到执行。”

.done().fail()对立。根据成功还是失败,其中只有一个会针对任何单个延迟对象进行触发。

deferred.done()

添加处理程序时,递延对象是解决被调用。

deferred.fail()

添加处理程序时,递延对象是拒绝被调用。


情况C

.then()

添加处理程序时,递延对象是解决被调用,拒绝,或仍在进行中

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

但是有一个重要区别:

在jQuery 1.8中,deferred.then()方法返回一个新的承诺...

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


摘要:

如果你试图让期待已久的连续通话,使用.then()。这将允许您在一系列新的承诺中通过链进展,同时保持原始延迟对象的状态和值。

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