この記事では、Node.js での非同期制御フローの仕組みと実装について説明します。
Node.js の非同期制御フローとは何ですか?
Node.js の非同期制御フローとは、ネットワーク要求の作成やイベントの処理など、非同期操作を処理するときに実行フローを管理および制御する方法を指します。 Node.js は非同期の性質に特化して設計されていますが、特定のコードが意図したシーケンスで実行され、エラー処理が効果的に実行されることを保証することをお勧めします。
非同期制御フローの理解を助けるコード例を見てみましょう。
fsObjでした = 必要とする ( 「fs」 ) ;
//抽象化されたコールバック関数
関数 readFileAsync ( ターゲットファイルパス ) {
戻る 新しい 約束 ( ( 解決する、拒否する ) => {
fsObj. ファイルの読み取り ( ターゲットファイルパス、 「utf-8」 、 ( エラー、内容 ) => {
もし ( エラー ) {
拒否する ( エラー ) ;
} それ以外 {
解決する ( コンテンツ ) ;
}
} ) ;
} ) ;
}
// 複数のファイルを順番に読み込む関数
非同期関数 readFileSequentially ( ) {
試す {
定数 ファイル1データ = readFileAsync を待つ ( 'mynewfile1.txt' ) ;
コンソール。 ログ ( 「最初のファイルデータ:」 、ファイル1データ ) ;
定数 ファイル2データ = readFileAsync を待つ ( 「ユースケース.txt」 ) ;
コンソール。 ログ ( 「2番目のファイルデータ:」 、ファイル2データ ) ;
定数 ファイル3データ = readFileAsync を待つ ( 「パッケージ.json」 ) ;
コンソール。 ログ ( 「3番目のファイルデータ:」 、ファイル3データ ) ;
} キャッチ ( エラー ) {
コンソール。 エラー ( 「発生したエラー:」 、 エラー ) ;
}
}
readFileSequential ( ) ;
上記のコードの説明は次のとおりです。
- まず、「」をインポートします fs ” モジュールを作成し、そのオブジェクトを ” に保存します fsObj ' 変数。
- 次に、「」を定義します。 readFileAsync() ” という単一パラメータを持つ名前付き関数 ターゲットファイルパス 」には、対象のファイルのパスが含まれています。
- この関数は「」を返します。 約束 」 という 2 つのパラメータで構成される必要なコールバック関数が含まれています。 解決する ' そして ' 拒否する ”。
- コールバック関数内で、「 readFile() 「」によって提供されるメソッド fs 」モジュール。また、提供されたパラメータ「」を渡します。 ターゲットファイルパス 」を「readFile()」メソッドの最初のパラメータとして指定します。
- ” ファイルの読み取り 」メソッドには、「」のパラメータを持つ必要なコールバック関数も含まれています。 エラー ' そして ' コンテンツ ”。 「」を渡します エラー ”を”に 拒否する() 「エラーが発生した場合の対処方法」と「 コンテンツ ”を”に 解決する() エラーが見つからなかった場合は、「」メソッドを使用します。
- ここで、「」という名前の非同期関数を作成します。 readFileSequentially() ” そしてそれには” が含まれています トライ/キャッチ ' ブロック。
- 「」の中 試す ” ブロックで、すでに作成されている “ を呼び出して生成された結果を格納する 3 つの変数を作成します。 readFileAsync() ' 関数。毎回、実行する必要がある目的のファイルのパスがこの関数の括弧内に渡されます。
- キーワード「 待つ 」も呼び出し時に関数の後ろに配置され、ファイルの読み取りアクションが完了するまで制御フローを停止します。
- また、コンソールに変数を表示して、取得または読み取ったファイルの内容を表示します。
- 最後に、これを含む「」を呼び出します。 readFileSequentially() ' 関数。
実行するには、上記のコードを拡張子「」を持つ目的のファイルに配置します。 .js ” は Node.js プロジェクト内に存在します。この場合のメインファイルは「 コントロールフロー.js ” なので、実行コマンドは次のようになります。
ノード制御フロー。 js
生成された出力は、非同期制御フローを使用して目的のファイルのデータが順番に表示されていることを示しています。
Node.js でブロックされたコードの考えられる原因と回避手順は何ですか?
同期コードは「」とも呼ばれます。 ブロックコード 」は、実行中のプロセスが実行されるまでプロセスの実行を停止するためです。これにより、アプリケーションのパフォーマンスと応答性が低下します。ブロッキング コードは通常、同期操作または CPU に依存した操作が原因で発生します。コード ブロッキングの考えられる原因とその回避方法を以下の表に示します。
コードブロッキングの原因 | コードブロッキングのソリューション |
fs.readFileSync() などの同期ファイル操作の使用。 | fs.readFile などの非同期ファイル操作を使用します。 |
大量の計算や長時間実行されるループなど、CPU に負荷がかかる操作の使用。 | CPU に依存するタスクをより小さなノンブロッキング チャンクに分割することで、ワーカー スレッドにオフロードします。 |
リモート API への HTTP リクエストの使用により、外部ネットワーク リクエストが遅くなる | Axios や組み込みの「http」または「https」モジュールなどの非同期 HTTP ライブラリを使用します。 |
最適化されていないデータベースクエリ | データベースによって提供されるクエリ最適化ツールを使用して、データベース クエリを最適化します。 |
無限ループまたは中断のないタイトなループの使用。 | ループには終了条件があり、無限に実行されないようにします。 |
結論
非同期制御フローではキーワード「 非同期/待機 」を使用して、非同期方法で実行フローを変更または制御します。必要な非同期メソッドのコールバックは抽象化され、別の関数に保存されます。この関数は、必要に応じて他のメソッドとともに await キーワードを使用して順次呼び出されます。これらの関数は、別のカスタム非同期関数に保存され、実行を開始するために呼び出されます。このガイドでは、Node.js の非同期制御フローについて説明しました。