2017-11-11 8 views
2

私はこのような非同期関数をいくつか呼び出そうとしています。なぜAとBのケースが失敗したのですが、Cのケースで成功したのですか?この場合jquery defered呼び出しのこれらのパターンの違いは何ですか?

ケース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

'firstCall()'は何を返しますか?どのバージョンのjQuery? – charlietfl

答えて

0

この回答のすべての外部引用符は、jQuery Deferred Object documentationまたはそこにリンクされている対応するメソッドドキュメントから取られています。 "ちょうど待たずに実行...常に一部。"


CASE

は「年代が.fail()のドキュメントを見てみましょう:

deferred.fail()

...遅延オブジェクトを返し、繰延オブジェクトの他の方法は、これに連鎖することができ...

.fail()方法ではなく、新しい約束を開くより元繰延オブジェクトを返します。これが意味することは、イベントが連続して実行されている間に、それにチェーンされたイベントは、元のイベントが終了するまで本質的に待つことではないということです。 .fail()は待たれることはありませんが、すぐにを実行します。

あなたが付けたいコールバックメソッドは、内部関数に連鎖して、遅延オブジェクトの入れ子になったサイクルを作成する必要があります。コールバックが3〜4回深くなった場合、どのくらい醜いかが想像できます。

幸いにも、.then()がこの正確な目的のために存在します!しかし、それ以上のケースCでは...


CASEのBから"この場合は、一部に失敗した場合に実行されますが、行われ一部実行されない飽きないます。"

.done().fail()反対です。それらのうちの1つだけが、成功するか失敗するかに基づいて、単一の遅延オブジェクトに対して起動します。

deferred.done()

繰延オブジェクトがを解決されたときに呼び出されるハンドラを追加します。

deferred.fail()

繰延オブジェクトがを拒否されたときに呼び出されるハンドラを追加します。


CASE C

.then()

繰延オブジェクトがはまだ進行中で、またはを拒否し、を解決されたときに呼び出されるハンドラを追加

.then()および.fail()はいずれも拒否された遅延オブジェクトを処理します。

は、しかし大きな違いがある:jQueryの1.8のよう

deferred.then()方法は、新しい約束を返す...

.then()は、新しい約束を返します。 .fail()ではありません。これは、.then()メソッドにチェーンされたすべてのメソッドが、元の遅延オブジェクトのように完了を待つことを意味します。


概要:

あなたはシーケンシャル待望の呼び出しを行うためにしようとしている場合は、.then()を使用しています。これにより、オリジナルの繰延オブジェクトのステータスと値を維持しながら、一連の新しい約束としてチェーンを進めることができます。

延期されたオブジェクトを「閉じる」準備が整ったら、.done(),.fail()、または.always()のような遅延オブジェクトを返すメソッドを使用します。

関連する問題