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 パッケージ プロジェクトのデプロイの実装

推薦する

Linux でディスクをマウントし、起動時に自動的にマウントするように設定する方法

皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...

Linux カーネル デバイス ドライバー キャラクタ デバイス ドライバー ノート

/******************** * キャラクターデバイスドライバー**********...

WeChat アプレット学習 WXS 使用方法チュートリアル

wxsとは何ですか? wxs (WeiXin Script) は、小規模プログラム用のスクリプト言語...

Vueでブラウザ共有機能を呼び出す方法

序文Vue(発音は /vjuː/、view に似ています)は、ユーザーインターフェイスを構築するため...

Docker はすべてのコンテナをバッチ起動して閉じます

Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...

Linux で見つけるためのフレンドリーな代替手段 (fd コマンド)

fd コマンドは、Linux ファイル システムを検索するためのシンプルで簡単な方法を提供します。...

CentOS 8 に htop をインストールする方法のチュートリアル

システムをインタラクティブに監視したい場合は、htop コマンドが最適な選択肢の 1 つです。 ht...

VMware WorkStation を Docker for Windows で使用するための詳細なチュートリアル

目次1. はじめに2. Windows用Dockerをインストールする1. Windows用Dock...

MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)

mysql 効率的なクエリMySQL は、左結合の速度を上げるために group by を犠牲にし...

CSS スタイルを変更してグレーの Web ページ (色なし、明るい白黒のみ) を実現するいくつかの方法

通常、清明節、国哀悼日、大地震の日、影響力のある偉人の死去または命日には、ウェブマスターとして、故人...

Webpack3+React16コード分割の実装

プロジェクトの背景最近、webpackのバージョンが古いプロジェクトがあります。 リーダー層では今の...

Tomcatディレクトリ構造の詳細な説明

目次ディレクトリ構造binディレクトリconfディレクトリlibディレクトリwebapps ディレク...

Linux での syslogd および syslog.conf ファイルの解釈

1: syslog.conf の概要異なるタイプの Unix の場合、標準の UnixLog システ...

MySQL 5.7 MGR シングルマスター決定マスターノード方式の詳細説明

当銀行のMGRは年末に開始されます。公式文書を読んだり、毎日テストを受けたりしなければなりません。毎...