イベントループブラウザ環境では、js には独自のイベント ループがあり、node 環境にも同様のイベント ループがあります。 ブラウザ環境イベントループまず、ブラウザのイベント ループを確認しましょう。 要約すれば:
ブラウザ環境での例: 例: コンソールログ("1"); タイムアウトを設定する(() => { コンソールにログ出力します。 }, 1); 新しいPromise((res, rej) => { console.log("約束"); res('PromiseRes') }).then(val => { コンソールログ(val); }) コンソールログ("2"); 分析: ノード環境イベントループノードでは、イベント ループは主に6 つのステージに分かれています。
6つのステージ写真はインターネットから
主なステージ: ポーリングキューが空でない場合は、コールバックキューを走査し、キューが空になるかシステム制限に達するまで同期的に実行します。ポーリングキューが空の場合は、次の2つのことが起こります。 チェックステージ (1)setTimeoutとsetImmediateこれら 2 つは非常に似ていますが、主な違いは呼び出しのタイミングです。 setImmediate は、ポーリング フェーズ、つまりチェック フェーズが完了したときに実行されるように設計されており、チェック フェーズでのみ実行されます。 これら 2 つの実行のタイミングは、次の前または後のいずれかになります。 // // 非同期タスク内のマクロタスク setTimeout(() => { console.log('===setTimeout==='); },0); setImmediate(() => { console.log('===setImmediate===') })
例2: タイムアウトを設定する(() => { console.log('===setTimeout==='); },10); setImmediate(() => { console.log('===setImmediate===') }) 例3: 定数 fs = require('fs'); fs.readFile("./any.js", (データ) => { タイムアウトを設定する(() => { console.log('===setTimeout==='); },10); setImmediate(() => { console.log('===setImmediate===') }) }); ループの最初のラウンドでは、ファイルが読み取られます。コールバックでは、チェックフェーズに入り、setImmediate を実行し、タイマーフェーズでタイマーが実行されます。 (2)プロセス.nextTickこの関数は実際にはイベント ループから独立しています。独自のキューがあります。各ステージが完了すると、nextTick キューがある場合は、キュー内のすべてのコールバック関数がクリアされ、他のマイクロタスクの前に最初に実行されます。 例1: タイムアウトを設定する(() => { コンソールログ('timer1') Promise.resolve().then(function() { コンソールログ('promise1') }) }, 0) プロセス.nextTick(() => { コンソールログ('nextTick') プロセス.nextTick(() => { コンソールログ('nextTick') プロセス.nextTick(() => { コンソールログ('nextTick') プロセス.nextTick(() => { コンソールログ('nextTick') }) }) }) }) // nextTick=>nextTick=>nextTick=>nextTick=>timer1=>promise1 例2: 定数 fs = require('fs'); fs.readFile("./any.js", (データ) => { process.nextTick(()=>console.log('process===2')) タイムアウトを設定する(() => { console.log('===setTimeout==='); },10); setImmediate(() => { console.log('===setImmediate===') }) }); process.nextTick(()=>console.log('process===1')) 練習例非同期関数 async1() { コンソールログ('2') //awaitが終了するまで待機しますが、次のマイクロタスクawait async2()に入るため、それ以上実行されません。 コンソールログ('9') } 関数async2() { コンソールログ('3') } コンソールログ('1') setTimeout(関数() { コンソールログ('11') }, 0) setTimeout(関数() { コンソールログ('13') }, 300) setImmediate(() => console.log('12')); process.nextTick(() => console.log('7')); 非同期1(); process.nextTick(() => console.log('8')); 新しいPromise(関数(resolve) { コンソールログ('4') 解決する(); コンソールログ('5') }).then(関数() { コンソールログ('10') }) コンソールログ('6') 分析: 例: 非同期関数 async1() { コンソールログ('2') //awaitが終了するまで待機しますが、次のマイクロタスクawait async2()に入るため、それ以上実行されません。 コンソールログ('9') } 関数async2() { コンソールログ('3') } コンソールログ('1') setTimeout(関数() { コンソールログ('11') タイムアウトを設定する(() => { コンソールログ('11-1'); },100); setImmediate(() => { コンソールログ('11-2') }) }, 0) setTimeout(関数() { コンソールログ('13') タイムアウトを設定する(() => { コンソールログ('15'); },10); setImmediate(() => { コンソールログ('14') }) }, 300) setImmediate(() => console.log('12')); process.nextTick(() => console.log('7')); 非同期1(); process.nextTick(() => console.log('8')); 新しいPromise(関数(resolve) { コンソールログ('4') 解決する(); コンソールログ('5') }).then(関数() { コンソールログ('10') }) コンソールログ('6') 要約:ノードイベントループにおけるイベント実行順序に関する記事はこれで終了です。ノードイベント実行順序の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 参考: https://www.cnblogs.com/everlose/p/12846375.html 以下もご興味があるかもしれません:
|
<<: MySQL トランザクション分離レベルの表示と変更の例
>>: Docker で Harbor パブリック リポジトリを構築する方法の例
1. 内部結合クエリの概要内部結合は、アプリケーションで非常に一般的な結合操作であり、通常はデフォ...
1. ロゴに代替テキストを追加するこれには 2 つの利点があります。スクリーン リーダーがロゴ画像の...
序文Node は新しいプログラミング言語ではなく、JavaScript のランタイムに過ぎないとよく...
今日もとても実践的な事例です。名前を聞くだけで高度で難しそうですよね?今日はカルーセル画像の真髄を簡...
MySQL マルチテーブルクエリ (直積原理)まず、データが使用するテーブルを決定します。デカルト...
目次I. 概要2. 従来の多段階イメージ構築3. Buildkitを使用してイメージをビルドする4....
ウェブサイトを作成するユーザーの多くが、このような問題に遭遇すると思います。Chrome のデフォル...
現在、layuiの関係者はlayim友達検索ページの構造とスタイルを提供していません。私は個人的に非...
参考までにmysql5.5.28のインストールチュートリアルです。具体的な内容は次のとおりです。イン...
この記事では、画像のフェードインとフェードアウトを実現するためのjsの具体的なコードを参考までに紹介...
目次1. 基本的なイベント処理2. 親コンポーネントにカスタムイベントを送信するマウス修飾子4. キ...
FIFO通信(先入れ先出し)関連のないプロセス間の通信を可能にする FIFO 名前付きパイプ。パイプ...
JPQL は Java Persistence Query Language の略です。 Java ...
MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ス...
目次約束とは何ですか?拒否の使用法キャッチの使い方すべての使用法レースの使用約束とは何ですか? Pr...