背景新しい同僚がチームに加わり、チームのコード標準では 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 パッケージ プロジェクトのデプロイの実装
ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...
問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...
序文昨日、小さなプロジェクトを書いていたときに、txt ドキュメントのデータを mysql データベ...
目次意味文法例1. 初期値initが渡されない2. 初期値を渡す場合3. アレイの重複排除4. Re...
複数テーブルクエリ複数のテーブルから関連するクエリ結果を取得するには、単一の SELECT ステート...
目次どうしたの?いつ使うか列挙の数を制御するビット値コントロールインデックス非数値列挙結論はType...
この記事では、参考までに、Baidu Mapsを使用して都市の位置特定を実現するVueの具体的なコー...
コア資産管理プロジェクトでは、el-transfer にドラッグ アンド ドロップによる並べ替えと、...
目次1. 配列の平坦化の概念2. 実装1. 減らす2. toString と split 3. 結合...
MYSQL 5.6 スレーブレプリケーションの展開と監視MYSQL 5.6 のインストールと展開 #...
目次SVG による画像キャプチャCSS部分エフェクト画像表示ソースコードアドレスこれまで見てきたもの...
1. パラダイムこのパラダイムの英語名は Normal Form であり、1970 年代にリレーショ...
1.v-bind(略称:)コンポーネント プロパティのデータで定義されたデータ変数を使用するか、コン...
最近、vue について読みました。これまで基本的に見落としていた単一ファイル コンポーネントを見つけ...
通常、全員のスピーチを最初から最後まで読む必要があります。ただし、Stack Overflow には...