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 件のコメント:
コメントを投稿