JavaScript のよりエレガントなエラー処理方法 async await

JavaScript のよりエレガントなエラー処理方法 async await

背景

新しい同僚がチームに加わり、チームのコード標準では async await に try...catch を追加する必要があることがわかりました。彼はとても混乱したと感じました。もし多かったら(集中していなかったら)、たくさんの場所を追加する必要があるのではないでしょうか?それは不格好ではないですか?

なぜエラー処理が必要なのでしょうか?

JavaScript はシングルスレッド言語です。try...catch を追加しないと、エラーが直接報告され、実行は継続されません。もちろん、コードを try...catch で囲まなければならないということではありません。try...catch を使用するということは、この場所のコードがエラーを報告する可能性が高いことがわかっているので、try...catch を使用してエラーをキャプチャして処理し、プログラムの実行を続行することを意味します。

async await を実行する場合、通常は非同期シナリオで実行されることを理解しています。このシナリオではプロセスがブロックされないように、try...catch を使用することをお勧めします。

async await より適切なエラー処理

しかし、同僚が言ったように、try...catch を追加するのはあまりエレガントな動作ではありません。そこで Google で検索して、Javascript で try-catch ブロックなしで async await を記述する方法を見つけました。この記事では、よりエレガントな処理方法について説明し、それをライブラリ await-to-js にカプセル化しました。このライブラリには機能が 1 つだけありますが、以下に示すように、この機能をビジネスに完全に適用できます。

/**
 * @param { プロミス } プロミス
 * @param { Object= } errorExt - errオブジェクトに渡すことができる追加情報
 * @return { プロミス }
 */
エクスポート関数を<T, U = エラー> (
  プロミス: Promise<T>,
  errorExt?: オブジェクト
): Promise<[U, undefined] | [null, T]> {
  返品の約束
    .then<[null, T]>((data: T) => [null, data]) // 実行は成功し、返される配列の最初の項目は null になります。 2番目は結果です。
    .catch<[U, 未定義]>((err: U) => {
      if (errorExt) {
        オブジェクトにerrを代入します。
      }

      return [err, undefined]; // 実行に失敗しました。返された配列の最初の項目はエラーメッセージ、2番目の項目は未定義です。
    });
}

エクスポートのデフォルト;

ここで前提となる知識ポイントがあります: await は Promise の戻り値を待機することです。

通常、await コマンドの後には Promise オブジェクトが続き、結果を返します。 Promise オブジェクトでない場合は、対応する値が直接返されます。

したがって、Promise の特性を利用して、promise.then と promise.catch でそれぞれ異なる配列を返す必要があります。条件が満たされると、返される配列の最初の項目は null になり、2 番目の項目が結果になります。拒否された場合、返される配列の最初の項目はエラー メッセージになり、2 番目の項目は未定義になります。使用する際には、最初の項目が空かどうかを判定することでエラーがあるかどうかが分かります。具体的な使い方は以下のとおりです。

'await-to-js' からインポートします。
// CommonJS (つまり NodeJS 環境) を使用する場合は、次のようになります。
// 定数 to = require('await-to-js').default;

非同期関数 asyncTaskWithCb(cb) {
     err、user、savedTask、notification を実行します。

     [ err, user ] = (UserModel.findById(1)) を待機します。
     if(!user) return cb('ユーザーが見つかりません');

     [ err, savedTask ] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
     if(err) return cb('タスクの保存中にエラーが発生しました');

    通知が有効になっている場合
       [ err ] = await to(NotificationService.sendNotification(user.id, 'タスクが作成されました'));
       if(err) return cb('通知の送信中にエラーが発生しました');
    }

    保存されたタスクの割り当てユーザーIDがユーザーIDと等しい場合、
       [ err, notification ] = await to(NotificationService.sendNotification(savedTask.assignedUser.id, 'タスクが作成されました'));
       if(err) return cb('通知の送信中にエラーが発生しました');
    }

    cb(null、保存されたタスク);
}

まとめ

個人的には、async await にエラー処理を追加する必要があると考えていますが、try...catch 以外にも解決策はあります。 async await と Promise の機能を活用することで、async await エラーをよりエレガントに処理できます。

要約する

これで、JavaScript の async await のよりエレガントなエラー処理方法についての記事は終了です。async await を使用したエレガントなエラー処理の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JS ループで async と await を正しく使用する方法
  • JS で async await をエレガントに使用する方法
  • JavaScript の async と await のシンプルで詳細な学習
  • JavaScript における async と await の使い方とメソッド
  • JavaScript PromiseとAsync/Awaitの詳細な説明
  • JS で async と await を使用する方法

<<:  MySQLでANDとORを組み合わせる問題を解決する

>>:  Docker を使用した war パッケージ プロジェクトのデプロイの実装

推薦する

Ubuntu で nginx を使用して WebDAV ファイル サーバーを構築する詳細なプロセス

nginxをインストールするnginx-fullをインストールする必要があることに注意してください。...

Linux ホスト名設定の詳細な紹介

目次1. Linuxホスト名を設定するクライアントホストを構成するサーバーホストを構成する2. ホス...

Linux で特定の時間にコマンドを実行する方法

先日、rsync を使用して LAN 上の別のシステムに大きなファイルを転送していました。非常に大き...

MySQLメモリストレージエンジンに関する知識

メモリストレージエンジンに関する知識ポイントメモリ ストレージ エンジンは日常業務ではほとんど使用さ...

Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...

7つの基本的なXHTMLコーディングルールの概要

1. すべてのタグには対応する終了タグが必要です以前の HTML では、<p> や &l...

Centos7でのSambaサーバー構成(実戦)

サンバの概要Samba は、Linux および UNIX システム上で SMB プロトコルを実装する...

標準SQL更新ステートメントの3つの用途についての簡単な理解

1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...

このような大画面のデジタルスクロール効果が必要になる場合があります

大画面のデジタル スクロール効果は、最近の作業における大画面 UI ダイアグラムから生まれました。U...

Reactのコンポーネント共同利用実装

目次ネスティング親子コンポーネント通信ブラザーコンポーネント通信撤回するReact の Linked...

さまざまなHTTPリターンステータスコードの詳細な説明

サイト上のページを表示するためのリクエストがサーバーに送信されると(たとえば、ユーザーがブラウザでペ...

ミニプログラムは、カスタムのマルチレベル単一選択と複数選択を実装します

この記事では、参考のために、ミニプログラムでカスタムのマルチレベル単一選択および複数選択機能を実装す...

HTML テーブルタグチュートリアル (27): セルの背景画像属性 BACKGROUND

セルの背景画像を設定でき、任意の GIF または JPEG 画像ファイルを使用できます。基本的な構文...

GDBデバッグMySQL実戦ソースコードコンパイルとインストール

ソースコードをダウンロード git クローン https://github.com/mysql/my...