質問: new Promise(function (resolve, reject) { reject('テスト') }) hoge.catch(function (e) { alert(e) }) ``` エラー発生しない
回答: Promiseのthenメソッドは引数を省略した場合でも、コールバック関数が暗黙的に設定されます。これはEcmascript6の仕様で、ブラウザの独自実装ではありません。 このコードは、 ``` hoge.then(function (m) { alert(m) }) hoge.catch(function (e) { alert("catch") alert(e) alert("catch") }) ``` これと等価です: ``` hoge.then(function (m) { alert(m) }, function (e) { throw e }) hoge.then(function (m) { return m }, function (e) { alert("catch") alert(e) alert("catch") }) ``` thenメソッドの第2引数を省略した場合、Promiseがrejectされるとデフォルトで引数がthrowされます。`Uncaught (in promise)`が表示されるのはこれが原因です。 コメントへの補足: シーケンスの途中で発生したエラーをまとめて処理したいときは、第二引数を省略して最後にエラー処理を行うことができます。 ``` hoge = Promise.resolve('test') hoge.then(function (m) { alert(m); return 'test1' }).then(function (m) { alert(m); return 'test2' }).then(function (m) { alert(m); throw 'error' }).then(function (m) { alert(m); return 'test3' }).catch(function (m) { alert(m); }) ```