2022年2月6日日曜日

JavaScriptで非同期処理のawaitつけ忘れを防ぐ

 JavaScriptでバックエンド開発していると非同期処理を使うことが多いですよね。

そこで問題になるのがasync関数に対するawaitのつけ忘れ。まだasync/awaitが使えなくてPromiseオブジェクトに対してthen()catch()をしていた頃ならすぐ気づいたんですが、単に関数呼び出しにawaitをつけるだけというのは便利な反面忘れやすいです。よくやらかします。

JavaScriptは実行するまでPromiseオブジェクトかどうかわからないからESLintじゃ検出できないよなぁ。TypeScript ESLintならできるんかなぁと思いながらルールを探したらありました。

no-floating-promises

これです。URLでネタバレしてます。というかTypeScript ESLintの公式に用意されてたのに気づかず危うく自分で作るところでした。

有効にするとこうなります。

async function fooPromise(): Promise<void> {
}

// NG
fooPromise();                // 放置
fooPromise().then(() => {}); // catchしていない

// OK
await fooPromise();                    // awaitすればOK
fooPromise().then(() => {}, () => {}); // thenに2番めの引数を渡せばOK
fooPromise().catch(() => {});          // catchすればOK
fooPromise().finally(() => {});        // finallyでもOK

then()だけだとダメな理由は、最近のNode.jsではrejectされたPromiseオブジェクトをcatch()しないとUnhandledPromiseRejectionWarningが発生するからでしょう。catch()しないPromiseオブジェクトというのは、投げられた例外を一切キャッチしていないようなものなので、当然プログラム側のミスとすべきです。

このルールを有効にしてない奴らは今すぐしろ。


0 件のコメント:

コメントを投稿