2016-04-16 4 views
2

私は約束をthis video(36分の周りのコードを)見ているが、私は、コードのビットで混乱しています:と約束を使うとき、なぜ最後に呼ばれたのですか?

getUser('mjackson') 
.then(getTweets) 
.then(updateStatus) 
.then(undefined, handleError); 

私の問題は、このことを理解し、なぜ最後thenと呼ばれていますか?なぜ最初の引数としてundefinedが渡されますか?

getTweets()に失敗すると、updateStatus()は呼び出されません。だから私はなぜ、最後のthenが呼び出されたのか(なぜなら、updateStatus()を含んでいるもの)が呼び出されていないと混乱しているからです。

私はhandleErrorがコールバックであることを知っていますが、私はなぜundefinedが渡されたのか分かりません。

私はそれが理にかなっていると思います。

+0

私は彼が拒否扱うようにしたいので、それはあると思いますエミットした約束は解決された約束には何もしません。 –

答えて

5

thenのいずれかの機能が第2パラメータとして提供されていると、約束のチェーンから遠いすべての拒否された約束をキャッチして処理します。

したがって、getUserまたはgetTweetsまたはupdateStatusに失敗すると、エラーはhandleErrorで処理されます。

このコードは、最初のパラメータとしてundefinedを渡しています。この場合、updateStatusが最後に書いたものであり、成功した場合はそれ以上のことはありません。

ほとんどの約束ライブラリ、およびES6の約束の標準は本当に.then(undefined, ...)のためだけの省略形です.catch(...)方法を提供する:

getUser('mjackson') 
.then(getTweets) 
.then(updateStatus) 
.catch(handleError); 
+0

あなたが正しいです、私は間違ったコードを書いています。編集します。 – BugHunterUK

2

特にための非同期フロー制御のための約束の方法を使用して2つの方法が、ありますが、エラー処理。

最初は次のとおりです。

anOperation.then(onsuccess, onerror); 

秒は次のとおりです。

anOperation.catch(onerror); 

onsuccessは、最初のケースでは、未定義またはnullである場合、それは成功オプションが存在しないことを意味し(それは希望成功事例では、その後の成功に移ります)。

ほとんどのお使いのものは.then(onsuccess, undefined)です。

なお:

  • あなたはonsuccessでエラーをスローした場合、onerrorない解雇ありません。次のエラーに移動します。これは、同じ.thenに両方のコールバックを発射することは不可能である、それはあなたが、あなたが.catchまたはonerrorコールバックから値を返す場合のいずれか、またはシナリオ

  • 、あなたが、問題を解決したことが期待されますので、次のonsuccessの次の.thenに戻り値を返します。これはあなたが望むものを、再スローではない、またはPromise.reject

2

を返す場合then関数のシグネチャは次のとおりです。あなたが最初のパラメータとしてundefinedを渡すと

p.then(onFulfilled, onRejected); 

、それはp.catch(onRejected);として振る舞います

thenチェーンでは、すべての成功関数は、失敗した場合を除き、順序で呼び出されます。 1つが失敗した場合、aの2番目のパラメータが存在しないかぎり、すべての実行が中断されます。 2番目のパラメータはanyのcatchを振る舞います。

then関数が約束を返す場合は、thenチェーンを作成できます。 handleErrorが呼び出されました。これは、チェーン内の以前の約束事の1つが失敗したためです。例えば

Here my JsBin to understand a promise chain有する鎖で

約束。 doXまたはcatchX関数のgiveMeSuccessPromiseおよびgiveMeFailPromise関数を変更してみてください。以下のようにthen句の鎖で

:この例では

p.then(doFirst) 
    .then(doSecond) 
    .then(doThird) 
    .then(undefined, catchFirstSecondThird) 
    .then(doFourth) 
    .then(doFifth, catchEveryThing); 

doFirst、doSecond又はdoThirdのいずれかの場合には、実行されるcatchFirstSecondThirdに失敗しました。 catchFirstSecondThirdのいずれかの場合、doFourthまたはdoFifthが失敗しましたcatchEveryThingが実行されます。

ハッピーパスで実行順序:

doFirst、doSecond、doThird、doFourth、doFifth

実行の順序だけdoFirstが失敗した:

doFirst、catchFirstSecondThird、doFourth、doFifth

のみdoSecondが失敗した実行の順序:

doFirst、doSecond、catchFirstSecondThird、doFourth、doFifth

実行の順序doFirstとdoFourth両方失敗:

doFirst chFirstSecondThird、doFourth、catchEveryThing

資源:

関連する問題