2016-10-28 9 views
0

私の質問は、どのようにしてエラーが一連の継続を介してキャッチ継続に伝播するかということです。ES6プロミスエラー処理

は、私たちが拒否約束を持って行1の後

Promise.reject(new Error("some error")) 
     .then(v => v + 5) 
     .then(v => v + 15) 
     .catch(error => console.log(error)); 

を考えます。継続が呼び出されると、.then(v => v + 5)は元の拒否された約束がそのまま返されます。同じことが3行目に当てはまります。したがって、継続は実行されず、キャッチ継続に達すると、引き続きキャッチ継続に渡される結果と同じ元のオブジェクトが残ります。

この仮定は正しいですか?

+1

はい、それは正しい –

+0

拒否された約束は、次のエラーハンドラに渡されます( 'catch'または' then(...、handler) ')。その間にあるすべてのものはスキップされます。 – deceze

+0

@torazaburoおそらく、「間にあるすべてのonFulfilmentハンドラはスキップされます(拒否された約束が得られます)」はさらに正確でしょうか? :) – deceze

答えて

3

はい、specから明らかなように:


2.2.7。 thenは約束を返さなければなりません。

promise2 = promise1.then(onFulfilled, onRejected); 

2.2.7.4。 onRejectedが[[または指定されていない]]関数ではなく、promise1が拒否された場合、promise1と同じ理由でpromise2を拒否する必要があります。言い換えれば


、それは(1ソートのそれをそのように考えることができますが)、中間then年代は 『スキップ』していること、または約束はそれらを 『通って落下』という正確ではありません。むしろ、彼らが返す約束は、入力約束と同じ理由で拒否されます。

ところで、これらの「拒否」を「エラー」ではなく「拒否」と呼ぶ方が誤りではありますが(拒否の理由は誤りであることが多いですが)、より正確です。また、「継続」ではなく「ハンドラ」と呼ばれる方が一般的です。

1

はありません、thenメソッドが呼び出されたとき、それは結果はまだを知らない

あるとして、元の拒絶の約束が返されるので、新しい約束を作成し、それを返します。しかし、その新しい約束は、当初の約束が拒否されるとすぐに同じ理由で直ちに拒否されます。同様のことが3行目の約束のために起こり、4行目の最終的な約束はcatchコールバックの結果で解決されます。

1:あなたが尋ねていた少なくともES6の約束です。 Creedのような他の約束の実装は、最適化を行い、実際に拒否された時点で入力プロミスを返すだけです。

関連する問題