web-dev-qa-db-ja.com

Promise reject()は「Uncaught(in promise)」警告を引き起こします

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))
_

警告:

enter image description here

編集:

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

32
Yevgeny Kozlov

これは、最初の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) );
30
trincot

Promisesを正しく使用しても:p.then(p1).catch(p2)は、window.onerrorのようなメカニズムを使用してキャッチしようとする例外を最終的にp2関数がスローする場合、キャッチされない例外を取得できます。その理由は、promiseで行われたエラー処理によってスタックが既に解かれているためです。これを修正するには、エラーコード(リジェクト関数によって呼び出される)が例外をスローしないことを確認してください。単純に戻るはずです。

エラー処理コードがスタックが既に解かれていることを検出できればいいので(したがって、エラー呼び出しにはこの場合のフラグは必要ありません)、誰かがこれを簡単に行う方法を知っているなら、私はこの答えを編集しますその説明を含めるために。

0
David Spector