イベントループブラウザ環境では、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: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...
Microsoft は T4 テンプレートを提供していますが、使用するのが非常に難しいと思います。ス...
ダウンロードダウンロードアドレス: https://redis.io/download /usr/l...
実験環境は以下のとおりですここでは、4 台のサーバー (1 台の nginx、負荷用の 2 台の t...
目次序文非同期イテレータとは何ですか?非同期イテレータストリームとしてページング機能を備えたAPIの...
目次1. 原因2. デバイス情報3. 準備4. Apacheをインストールする5. gitを設定する...
1. 物件リストコードをコピーコードは次のとおりです。色: #999999 テキスト色フォントファミ...
1. はじめに周知のように、データベース ミドルウェアの読み取り/書き込み分離のアプリケーション シ...
1. 矢印関数1. 矢印関数自体はこれをバインドしないという事実を利用します。 2. render(...
以前、上司からログイン後にチェックマークを表示できるプログラムを作るように言われたのですが、Baid...
Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存...
この記事の例では、タイムライン再生コンポーネントを実装するためのVUEの具体的なコードを参考までに共...
ハードウェア ビュー コマンドシステム # uname -a # カーネル/オペレーティング システ...
1. ソースコードの設計コードをコピーコードは次のとおりです。 <!DOCTYPE html ...
このブログのすべてのコンテンツは、クリエイティブ コモンズ ライセンスの下でライセンスされています。...