質問: 'number') resolve(num * 2) else reject(`${num} is not numbers.`) }) } /* L1 */ promiseFunc("a") /* L2 */ .then(res => promiseFunc(5)) /* L3 */ .then(res => console.log(res)) /* L4 */ .catch(e => console.log(e)) ``` 結果としては、L4まで実行され、`"a" is not numbers.`とエラーが出ます。 L1で、このPromiseインスタンスのステータスはrejectedとなります。 しかしL2では`.then()`のrejected用のコールバックは指定していません。 このときどのような挙動になるのでしょうか。 メソッドチェーンを中断せず最後の`.catch()`までエラーが到達する仕組みがわかりません。 デフォルトで err => throw(err) となるとどこかで目にしたのですが本当でしょうか。なかなかエヴィデンスを見つけられず。。 何か質問に不足があればコメントいただけると幸いです。 よろしくお願いします。
回答: `Promise.prototype.then`に関数が1つ(resolved)しか指定されていない場合、元のPromiseがrejectedとなると、**同じ状態を持った新しいPromise**を返して、関数の方はもちろんスルーされます(MDN)。 なので、L2・L3では、「rejectedのPromiseを引き継いだ新たなPromiseを生成するだけ」の処理が行われ、L4で`catch`されます。