この記事では、Node.js の非同期について詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
Node.js 非同期については、ノンブロッキング I/O と Event の 2 点が避けられません。ループ 。この2点があるからこそ、Node.jsはオンライン環境でも高機能と言えるので、Node.jsの非同期の仕組みと使い方を学んでいきましょう! [推奨学習: 「nodejs チュートリアル 」]
/
Output、システムの
入力と出力。
、これはノンブロッキング I/O です。 ノンブロッキング I/O を理解するための鍵は、
Input
I/O プロセス中に他の I/O
を実行できるかどうかを検討してください。
Node.js はコンピュータの制御に使用されます。ファイルの読み込みなどの一部の操作には非常に時間がかかります。他の I/O が実行できない場合、処理効率は非常に低くなります。はい、これは 1 つです。 Node.js がノンブロッキング I/O である理由。
Node.js のイベント ループ
Node.js は、起動時に libuv が提供する
イベント ループ
フェーズ: このフェーズは、
timer) I/O
callbacks# のコールバックを実行します。 ## フェーズ: 前のサイクルからのいくつかの未実行 I/O コールバックを処理します。 idle フェーズ: Node
# によって内部的にのみ使用されます。 ##poll
ステージ: 新しい I/O イベントを取得します。ノードは適切な条件下でここでブロックします。
check
ステージ:
socket
の close
イベント コールバック
##各ステージには次のものがあります。コールバックを実行するための先入れ先出し (FIFO) キュー。イベント ループが各ステージまで実行されると、コールバック関数は、キューの内容が消費されるまで、対応するコールバック キューから実行のために取り出されます。または、実行されたコールバックの数が最大 その後、イベントループは次のステージに入り、次のステージに対応するキューからコールバック関数が取り出して実行され、これをイベントループの最終ステージまで繰り返します。イベントループもプロセスが終了するまで順次実行されます。
イベント ループ内の 6 つのマクロ キューとマイクロ キューの関係は次のとおりです。 マイクロ キュー (
microtask)。
特に混乱を招くバージョン変更を次に示します: setTimeout
、setInterval
、および setImmediate
3 つ (I/O を除く)、マイクロタスク キューをすぐに実行し、マイクロキュー内のすべてのマイクロタスクを実行してから、マクロキューに戻って次のマクロタスクを実行します。この はブラウザ側の操作 と一致しています。 callback
error-first コールバック
ノード スタイル コールバック
で、その後にパラメータは次のとおりです。結果。
// 第一个参数是错误捕获 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) }
:
async.js;
async.js 非同期プロセスを制御するには
: プログラミング方法
は約束を意味します。現在のイベント ループでは結果を取得できませんが、将来のイベント ループでは結果を取得できます。結果が表示されます
または
rejected であると判断されると、状態は変わりません
resolved
: 成功した状態
#rejected
.catch
は、状態の最初の
.then
rejected
rejected ステータスの最初の
.catch
.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 を実行すると、新しい Promise が返されます
、Promise
最終状態は、then
および catch
コールバック関数 if の実行結果に基づいて決定されます。コールバック関数は最終的に
throw
rejected
ステータス
コールバック関数が最終的に return
の場合、 resolved
Status
しかし、コールバック関数が最終的に return
で Promise
はコールバック関数と同じになりますreturn
の Promise
状態は一貫したままです
Node.js 非同期プログラミング –
async function の構文上のシュガー カプセル化です。
非同期プログラミングの究極のソリューション – 同期的な方法で非同期に記述する
#await#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) }) }
これは、イベント ループを通じて存在する
関数です。 ステート マシン
であり、初期状態は resolved
であると判断されると、または 拒否されましたは変更されず、.then
および .catch
を通じてチェーン呼び出しを行うことができます。
async
/await
プログラミング関連の知識について詳しくは、
プログラミング ビデオをご覧ください。 !
以上がNode.js の非同期性の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。