⚾
Promise.catchは同等のものを返すがインスタンスは新しい。
Promise.catchって破壊的なメソッドだと思ってました。って話です。
ハマったコード
以下のコードでunhandled errorになった。
const func = async (suppressError: boolean = false): Promise<void> => {
const p = new Promise(() => { /* do something */ });
if (suppressError) {
p.catch(() => {});
}
await p;
}
func(true);
仕様を確認しよう
はいというわけで、確認しましょう。
これは即座に同等の Promise オブジェクトを返すので、他のプロミスのメソッドを連鎖 して呼び出すことができます。
返値
新しい Promise を返します。
ほえーなんか不思議な感じ。
どう書く?
再代入するかcatchして投げ直す。
ここでは再代入するパターン。
const func = async (suppressError: boolean = false): Promise<void> => {
let p = new Promise(() => { /* do something */ });
if (suppressError) {
p = p.catch(() => {});
}
await p;
}
func(true);
Discussion