2017-11-11 91 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()