イベントループブラウザ環境では、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 パブリック リポジトリを構築する方法の例
目次序文問題の説明原因分析拡大する総括する序文最近、データの欠落やデータの損失に関するフィードバック...
ノードにおけるhttpの役割は何ですか? httpモジュールの役割は、サーバーの作成と記述を支援する...
目次1. 証明書を生成する2. リモートを有効にする3. リモート接続3.1 Jenkins接続3....
以前、Docker コンテナとローカル マシン間のファイル転送に関する記事を書きました。しかし、この...
1. 背景私たちは時々社内研修を行っており、実験環境をよく利用しています。最初はdockerコンテナ...
目次スプリングブートDocker spring-boot-maven-プラグインSpotify Ma...
HTML にオーディオ ファイルを挿入した後 (mp3 ファイルを再生した後) に発生したいくつかの...
この記事では、Vueの自己ネストツリーコンポーネントの使い方を参考までに紹介します。具体的な内容は次...
序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...
1. はじめに最近ブログをアップグレードし、記事ページの下部に前の記事と次の記事に直接ジャンプできる...
MySQLデータベースの基本構文DDL操作データベース作成構文: create database デ...
目次概要インデックスデータ構造バイナリツリー赤黒木BツリーB+ツリーハッシュ索引InnoDB インデ...
ボリュームとは何ですか?ボリュームは英語で容量を意味し、Docker ではデータ ボリューム、つまり...
十分に最適化されていない、またはパフォーマンスが極端に低い SQL ステートメントに直面した場合、通...
MySQL には、主に left()、right()、substring()、substring_i...