このコードを試しています:
リーリー
ふと気づいたとき:
Promisewith999
fulfilled したがって、 catch()
メソッドは実行されません < /strong> ただし、 catch()
によって返される Promise (この場合は returnCatch
) は最終的に fulfilled となり、値は >with999
.
それでは、私の質問は、なぜ catch()
は returnCatch の約束を
果たすことになるのでしょうか?
returnCatch が
ハングすることを期待していました (catch() が実行されなかったため) then()
を使用しても何も起こりません。
< /code>「反対のことをする」場合にも同じことが起こります。
約束を
拒否する:
リーリー
誰か何が起こっているのか説明してもらえますか?
このコードは、最初の Promise に .then と .catch を連鎖させるのと同じです。これは当てはまりません。catch の新しい変数を作成するには、それを拒否してから次の変数にパイプする必要があります。
これは、複数の変数を使用せずに同じステートメントを一度に記述することと考えてください。そのような動作はより理にかなっています。 Promise が解決されると、最初の .then が実行され、Promise が拒否された場合は、それらの順序や宣言、またはこれを行うために使用する変数の数に関係なく、最初の .catch が実行されます。
###編集: このコード スニペットは上記のものと同じであり、同じ Promise を渡します。「なぜ」という質問に答えるのはいつも難しいですが、基本的にはこれに要約されます。「それが機能するから」です。
これは、フルフィルメント結果を渡す
catch()
の動作からは明らかではないかもしれませんが、拒否について渡す.then()
の 2 番目の例を見てください。 プロミス チェーンの初期で発生するエラーを処理するために、 に.catch()
コールバックを実行させたい。エラーが発生して.then()
コールバックが実行されないために、Promise チェーンが途中で停止する (Promise が保留状態のままになる) ことは望ましくありません。この動作は、
.then(handleResult)
と.catch(handleError)
の間で対称であることがわかりました。ただし、これらは実際には.then(handleResult, null)
および.then(null, handleError)
の単純化された構文であることに注意してください。then
メソッド は実際には 2 つのパラメータを受け取ります。1 つは履行を処理するパラメータ、もう 1 つは拒否を処理するパラメータです。両方の試験に同時に合格することができます (そして通常はそうすべきです)。.then()
返された Promise は、対応するハンドラーの結果に基づいて解決されます (呼び出しが例外をスローした場合は拒否されます)。Promise チェーンの背後にある考え方は、最初は常に
であるということです。コミットメントは、コミットメントが解決されて初めて解決されました。対応するコールバックが提供されていない場合、デフォルトでは、.then(null, null)、
.then(null, handleError)が Promise を満たしたか、# されたかどうかの結果のみが渡されます。拒否された Promise に対する ##.then(handleResult, null)
。