Promise reject()
コールバックが呼び出されると、警告メッセージ "Uncaught(in promise)"がChrome=コンソールに表示されます。その背後にある理由に頭を包むことも、それを取り除く方法もありません。
_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))
_
警告:
編集:
onRejected
ハンドラーが.then(onResolved, onRejected)
メソッドに明示的に提供されない場合、JSは暗黙的なものを自動的に提供することがわかりました。次のようになります:_(err) => throw err
_。自動生成されたハンドラーは順番にスローします。
参照:
IsCallable(onRejected) `がfalseの場合、
LetonRejectedを「Thrower」とする。
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen
これは、最初のthen
メソッドによって返されたプロミスにcatchハンドラーをアタッチしないために発生します。したがって、プロミスが拒否された場合のハンドラーはありません。あなたはdo最後の行のpromise p
に対して1つを持っていますが、chainedに対しては持っていませんthen
メソッドによって返されるpromiseの前の行。
以下のコメントに正しく追加したように、キャッチハンドラーが提供されていない(または関数ではない)場合、 デフォルトはスローされます エラーです。 promiseチェーン内で、このエラーはcatch
メソッドコールバックでキャッチできますが、ない場合、JavaScriptエンジンは他のキャッチされていないエラーと同様にエラーを処理し、デフォルトのハンドラーを適用しますそのような状況は、コンソールに表示される出力をもたらします。
これを回避するには、次のように、最初のthen
によって返されるpromiseに.catch
メソッドをチェーンします。
p.then( result => console.log('Fulfilled'))
.catch( error => console.log(error) );
Promisesを正しく使用しても:p.then(p1).catch(p2)
は、window.onerrorのようなメカニズムを使用してキャッチしようとする例外を最終的にp2関数がスローする場合、キャッチされない例外を取得できます。その理由は、promiseで行われたエラー処理によってスタックが既に解かれているためです。これを修正するには、エラーコード(リジェクト関数によって呼び出される)が例外をスローしないことを確認してください。単純に戻るはずです。
エラー処理コードがスタックが既に解かれていることを検出できればいいので(したがって、エラー呼び出しにはこの場合のフラグは必要ありません)、誰かがこれを簡単に行う方法を知っているなら、私はこの答えを編集しますその説明を含めるために。