2017-02-25 10 views
10

約束reject()コールバックが呼び出されると、警告メッセージ"Uncaught(promise)"がChromeコンソールに表示されます。私はその背後にある理由のまわりで私の頭をラップすることはできません、またそれを取り除くためにどのように。Promise reject()により "Uncaught(promise)"の警告が発生する

var p = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    var isItFulfilled = false 
    isItFulfilled ? resolve('!Resolved') : reject('!Rejected') 
    }, 1000) 
}) 

p.then(result => console.log(result)) 
p.catch(error => console.log(error)) 

警告:

enter image description here

編集:私はonRejectedハンドラが明示的に.then(onResolved, onRejected)メソッドに提供されていない場合は、JSは自動的に暗黙の1を提供することが分かった

(err) => throw err:それはこのようになります。自動生成されたハンドラが順番にスローされます。

参考:IsCallableは(をonRejected) `ある場合

、その後、
     はは "投げる人" でonRejectedしてみましょう。

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen

答えて

8

あなたはそのための約束を拒否したときのハンドラなしで最初then方法によって返さ約束にcatchハンドラを添付していないためです。 の場合には最後の行の約束pがありますが、thenの方法で返された約束の約束の前の行にはありません。 catchハンドラが提供されていない

あなたは正しく以下のコメントで追加されたよう

、(またはそれは機能ではありません)、default one will throwエラー。約束の連鎖の中で、このエラーはcatchメソッドコールバックとラインの下のキャッチすることができますが、存在しない場合は、JavaScriptエンジンは、他の不明なエラーと同様のエラーに対処します、そして、その結果、このような状況では、デフォルトのハンドラを適用しますコンソールの出力に表示されます。これを避けるために

、このように、最初のthenによって返された約束に.catch方法をチェーン:

p.then(result => console.log('Fulfilled')) 
.catch(error => console.log(error)); 
+0

あなたはtrincotありがとうございます。私はいくつかの余分な研究を行い、onRejectedハンドラが明示的に渡されない場合、JSは暗黙的なものを提供することを発見しました: If IsCallable(onRejected)が** false **の場合 'onRejected'を" ** Thrower ** " 'のarg => '()=> {}は'この動作をオーバーライドすることができますarg' 空onRejectedハンドラを投げる:次のようになります 。しかし、「ヌル」はそうしません。 _ref:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen_ –

+0

どういたしまして、とECMAScriptの仕様に素敵な言及!私は完全性のためにこれを私の答えに加えました。すばらしいです! – trincot

+0

@trincot私はそれを連鎖させて、まだキャッチしていないエラーメッセージを返します –

関連する問題