Node.js の非同期性の詳細な分析
Jun 08, 2021 am 10:39 AMこの記事では、Node.js の非同期について詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
Node.js 非同期については、ノンブロッキング I/O と Event の 2 点が避けられません。ループ 。この2点があるからこそ、Node.jsはオンライン環境でも高機能と言えるので、Node.jsの非同期の仕組みと使い方を学んでいきましょう! [推奨学習: 「nodejs チュートリアル 」]
Node.js のノンブロッキング I/O
- ##I/O は
- Input
/
Output、システムの
入力と出力。 ブロッキング I/O とノンブロッキング I/O の違いは、入力から出力までの期間に - システムが他の入力を受信できるかどうかです。 食べ物の注文を例に挙げます。食堂で食べ物を注文するには列に並ぶ必要があります。このプロセス中、おばさんは一度に 1 人しか受け取ることができません。「注文 - おばさんがスプーンを振る」食べ物を積み込む - 「食べ物を持ってくる」プロセスでは、おばさんは他の人の注文を受け入れることができません。これは I/O をブロックしています。レストランに行って食べ物を注文するとき、ウェイターに欲しいものを伝えることができます。 「レストランに行くときはトマトを食べてください。スクランブルエッグ、ウェイターはそれを書いてシェフに渡しました。そのとき、別のテーブルが来てウェイターを呼び、ザリガニが食べたいと言った。つまり、ウェイター
、これはノンブロッキング I/O です。 ノンブロッキング I/O を理解するための鍵は、
Input- /
- Output# のシステムを決定することです。 ## 。
I/O プロセス中に他の I/O
を実行できるかどうかを検討してください。 - 食べ物の注文の例では、入力/ 出力
Node.js はコンピュータの制御に使用されます。ファイルの読み込みなどの一部の操作には非常に時間がかかります。他の I/O が実行できない場合、処理効率は非常に低くなります。はい、これは 1 つです。 Node.js がノンブロッキング I/O である理由。
Node.js のイベント ループ
Node.js は、起動時に libuv が提供する
イベント ループ
フェーズ: このフェーズは、
timer(setTimeout,
setInterval) I/O
callbacks# のコールバックを実行します。 ## フェーズ: 前のサイクルからのいくつかの未実行 I/O コールバックを処理します。- 、
- prepare
フェーズ: Node
# によって内部的にのみ使用されます。 ##poll
ステージ: 新しい I/O イベントを取得します。ノードは適切な条件下でここでブロックします。check
ステージ: setImmediate( ) - のコールバックを実行します。
- ステージ:
socket
のclose
イベント コールバック -
##各ステージには次のものがあります。コールバックを実行するための先入れ先出し (FIFO) キュー。イベント ループが各ステージまで実行されると、コールバック関数は、キューの内容が消費されるまで、対応するコールバック キューから実行のために取り出されます。または、実行されたコールバックの数が最大
に達しました。 -
その後、イベントループは次のステージに入り、次のステージに対応するキューからコールバック関数が取り出して実行され、これをイベントループの最終ステージまで繰り返します。イベントループもプロセスが終了するまで順次実行されます。
イベント ループ内の 6 つのマクロ キューとマイクロ キューの関係は次のとおりです。 マイクロ キュー (
microtask ) は、イベント ループのさまざまなステージ間、またはイベント ループの各ステージで実行されます。対応するマクロ キュー間で実行されるイベント ループ ( - macrotask
)。
特に混乱を招くバージョン変更を次に示します:
- Node10 以前のバージョンの場合: マクロ キュー内に複数のマクロ タスクがあり、マクロ キュー内のすべてのマクロ タスクが完了するまで、マイクロ キュー内のマイクロ タスクは実行されません。
- Node11 以降のバージョンの場合: ステージ内の対応するマクロ キュー内のマクロ タスクが実行されると (
setTimeout
、setInterval
、およびsetImmediate
3 つ (I/O を除く)、マイクロタスク キューをすぐに実行し、マイクロキュー内のすべてのマイクロタスクを実行してから、マクロキューに戻って次のマクロタスクを実行します。この はブラウザ側の操作 と一致しています。 - コールバック関数の形式の仕様
error-first コールバック
ノード スタイル コールバック
##最初のパラメータは - error
で、その後にパラメータは次のとおりです。結果。
- npm
:
async.js;
async.js非同期プロセスを制御するには
- thunk
: プログラミング方法
- Promise
は約束を意味します。現在のイベント ループでは結果を取得できませんが、将来のイベント ループでは結果を取得できます。結果が表示されます
これはステート マシンです。状態が - resolved
または
rejectedであると判断されると、状態は変わりません
- # #pending
- : 初期状態、まだ結果が得られていない状態
- /
resolved
: 成功した状態#rejected
: 失敗ステータス
.then - : 初期状態、まだ結果が得られていない状態
- Promise
は、状態の最初の
.thenrejected
をコールバックします - Promise
ステータスの最初の
.catch をコールバックしますが、 - Promise## の後に
.catch が続くことはありません
#、ブラウザ/ノード環境でグローバル エラーが発生します// promise的状态转换以及通过then获取内容 const promise = new Promise((resolve, reject) => { setTimeout(function () { resolve(3); // reject(new Error(4)) }, 500) }) promise.then(function (result) { console.log(result) }).catch(function (err) { console.log(err) }) setTimeout(() => { console.log(promise) }, 800)
ログイン後にコピーthen
と - は
rejected
ステータスコールバック関数が最終的に
return
の場合、 Promise - は
resolved
Statusしかし、コールバック関数が最終的に
return
で Promise - を返した場合、
Promise
はコールバック関数と同じになりますreturn
のPromise
状態は一貫したままですNode.js 非同期プログラミング –
async の構文上のシュガー カプセル化です。
非同期プログラミングの究極のソリューション – 同期的な方法で非同期に記述する#await
キーワードは - async 関数の実行を「一時停止」できます
#await
キーワードは同期的に取得できますPromise
try-catch
の実行結果は、次のように取得されたエラーを取得できますawait
(async function () { await findJob() console.log('trip') })() async function findJob() { try { // 进行三轮面试 await interview(1); await interview(2); await interview(3); console.log('smile') } catch (e) { console.log('cry at ' + e.round) } } // 进行第round轮面试 function interview(round) { return new Promise((resolve, reject) => { setTimeout(() => { if (Math.random() < 0.2) { const error = new Error('failed'); error.round = round; reject(error); } else { resolve('success'); } }, 500) }) }
ログイン後にコピーこれは、イベント ループを通じて存在する
関数です。
- Node11以降のバージョンではブラウザのイベントループと同じように動作しますので、区別に注意してください。 Node.js の非同期プログラミングの仕様では、最初のパラメータは error
- で、結果は次のようになります。 Promise
- は
ステート マシン
であり、初期状態は pending - ですが、状態が
resolved
であると判断されると、または 拒否されましたは変更されず、.then
および.catch
を通じてチェーン呼び出しを行うことができます。async
/await
非同期 - を同期的な方法で記述することは、非同期プログラミングに対する究極のソリューションです。
プログラミング関連の知識について詳しくは、
プログラミング ビデオをご覧ください。 !
Node.js 非同期プログラミング - callback
// 第一个参数是错误捕获 interview(function (err, res) { if (err) { console.log('cry') return; } console.log('smile') }) function interview(callback) { setTimeout(() => { if (Math.random() > 0.2) { callback(null, 'success') } else { callback(new Error('fail')) } }, 500) }
Node.js 非同期プログラミング – Promise
- は文字通りに理解できます。
.catch
- 状態の
を実行すると、新しい Promise が返されます
、Promise
最終状態は、then
および catch
コールバック関数 if の実行結果に基づいて決定されます。コールバック関数は最終的に
throw
- Promise
await
async function
は、- Promise
I/O を実行するシステムを決定し、他のシステムがそうでないかを考えることにあります。 I/O は /O で実行できます。
Node.jsの- イベントループ
以上がNode.js の非同期性の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











クイックアプリケーション: PHP 複数ファイルの非同期 HTTP ダウンロードの実践的な開発事例分析

PHP 非同期コルーチン開発: データ キャッシュと読み取りおよび書き込み操作を高速化します。
