背景新しい同僚がチームに加わり、チームのコード標準では 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQLでANDとORを組み合わせる問題を解決する
>>: Docker を使用した war パッケージ プロジェクトのデプロイの実装
皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...
/******************** * キャラクターデバイスドライバー**********...
wxsとは何ですか? wxs (WeiXin Script) は、小規模プログラム用のスクリプト言語...
序文Vue(発音は /vjuː/、view に似ています)は、ユーザーインターフェイスを構築するため...
Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...
fd コマンドは、Linux ファイル システムを検索するためのシンプルで簡単な方法を提供します。...
システムをインタラクティブに監視したい場合は、htop コマンドが最適な選択肢の 1 つです。 ht...
<!--[lte IE 6の場合]> <![endif]--> IE6以下で...
目次1. はじめに2. Windows用Dockerをインストールする1. Windows用Dock...
mysql 効率的なクエリMySQL は、左結合の速度を上げるために group by を犠牲にし...
通常、清明節、国哀悼日、大地震の日、影響力のある偉人の死去または命日には、ウェブマスターとして、故人...
プロジェクトの背景最近、webpackのバージョンが古いプロジェクトがあります。 リーダー層では今の...
目次ディレクトリ構造binディレクトリconfディレクトリlibディレクトリwebapps ディレク...
1: syslog.conf の概要異なるタイプの Unix の場合、標準の UnixLog システ...
当銀行のMGRは年末に開始されます。公式文書を読んだり、毎日テストを受けたりしなければなりません。毎...