Promise.catchは同等のものを返すがインスタンスは新しい。

2023/02/14に公開

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 を返します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

ほえーなんか不思議な感じ。

どう書く?

再代入するか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