3

次のコードがあります。 そして、処理されていない拒否エラーをスローせずに期待どおりに動作します。今未処理の拒否エラーBluebird

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.catch (error) -> 
    console.log error 

、2番目のコード例は、未処理の拒否エラーをスローしません。 エラーを明確に処理しているときに、なぜこれが起こっているのか説明できる人がいますか?ところで

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.then -> 
    console.log 'ok' 

p.catch (error) -> 
    console.log error 

。私は1つが、将来的に追加されたかどうかを確認するために待つことなく、約束が拒否された登録されたcatchハンドラが存在しない場合ブルーバードはエラーをスロー

+0

どのように機能するかに関する詳しい情報は、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catchを参照してくださいが提起した1は、CoffeeScriptのですか?たぶんcoffeescriptタグを追加しますか? – dtkaias

+0

それはあなたのcoffeescriptです。タグを追加しました。 –

答えて

1

error management configurationパークロムと青い鳥v3.4.7でテストしています。拒否ハンドラのチェックは、プロミスチェーンを設定するスレッドに非同期に行う必要があることに注意してください。彼らが言うように、「いくつかのプログラミングパターンは偽陽性をもたらすでしょう」。はい、そうです?

一方、キャッチされない例外エラーはES6標準の一部ではなく、実装はさまざまな方法でそれらを処理します.FirefoxはGC時間まで待機するか、待機しますが、Chromeはタイムアウトします(またはタイムアウトに使用されます)。 「可能性のある予期しない拒否」エラー。

Bluebirdがハンドラを接続する前にどのようなエラーが発生する可能性があるかについては、Blue birdのマニュアルを参照してください。


しかし、どちらの例は、同期約束pため拒否ハンドラをアタッチするので、例外の理由は、他の場所であるように見えます。

@DJの答えに感謝していますが、解釈が異なります。 2番目の例では、thenは約束を返します。約束は、pが拒否された場合に拒否され、拒否ハンドラはありません。 .thenによって返された約束は、このエラーを投げている可能性が高いです。

+0

しかし、この回答では、約束が拒否されたときにキャッチハンドラがインストールされていないため、問題の2つの別々のコードブロックの違いは説明されていません。 – jfriend00

+0

@ jfriend00私は答えの最初の部分はこのエラーを説明しないことに同意します。私は第二の部分を明らかにした。 – traktor53

1

チェーン約束の場合、各チェーンはの新しいインスタンスとして扱われます。Promise

は、拒否の場合のみハンドラを提供する点を除いて、then()と似ています。

例1:catch()は、エラーが作成された元の約束の拒否を処理するためのものです。

例2:第1約束が解決されたら、第2約束に進み、成功と失敗のハンドラを提供してください。あなたはthen()内の関数でエラーを処理するためにそこにある持っているcatch()は、第一約束

キャッチが

+0

しかし、コードを実行すると、エラーが処理されていない拒否エラーとしてコンソールに記録されていることがわかります。したがって、 'catch()'は最初の約束の中のエラーを処理します。これはちょっと変わったようですね。ブルーバードがエラーが処理されていないと私に伝えると、なぜキャッチがまだ実行されますか? –

関連する問題