背景新しい同僚がチームに加わり、チームのコード標準では 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 パッケージ プロジェクトのデプロイの実装
nginxをインストールするnginx-fullをインストールする必要があることに注意してください。...
目次1. Linuxホスト名を設定するクライアントホストを構成するサーバーホストを構成する2. ホス...
先日、rsync を使用して LAN 上の別のシステムに大きなファイルを転送していました。非常に大き...
メモリストレージエンジンに関する知識ポイントメモリ ストレージ エンジンは日常業務ではほとんど使用さ...
背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...
1. すべてのタグには対応する終了タグが必要です以前の HTML では、<p> や &l...
サンバの概要Samba は、Linux および UNIX システム上で SMB プロトコルを実装する...
1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...
大画面のデジタル スクロール効果は、最近の作業における大画面 UI ダイアグラムから生まれました。U...
目次ネスティング親子コンポーネント通信ブラザーコンポーネント通信撤回するReact の Linked...
サイト上のページを表示するためのリクエストがサーバーに送信されると(たとえば、ユーザーがブラウザでペ...
<p><b>これは太字フォントです</b></p> ...
この記事では、参考のために、ミニプログラムでカスタムのマルチレベル単一選択および複数選択機能を実装す...
セルの背景画像を設定でき、任意の GIF または JPEG 画像ファイルを使用できます。基本的な構文...
ソースコードをダウンロード git クローン https://github.com/mysql/my...