イベントループブラウザ環境では、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 パブリック リポジトリを構築する方法の例
<br />ホームページの右側にあるスクロールバーを削除するにはどうすればよいですか? ...
トラブル発生が突然で、業務も迫っていたため、現場のスクリーンショットを撮る時間がありませんでしたので...
目次1. MySQL 結合バッファ2. JoinBufferCacheストレージスペースの割り当て3...
この記事では、Jingdongの虫眼鏡効果を実現するためのJavaScriptの具体的なコードを紹介...
疫病のせいで家にこもりきりで、頭がおかしくなりそうなので、パソコンを起動して頭を働かせてみました。今...
注意すべき点は、イベントバブリング自体の特性上、メリットだけでなくデメリットも生じるということです。...
目次1. プロジェクトの説明2. Nginxイメージの作成3. MySQLイメージの作成4. PHP...
この記事では、宝くじマシンの効果を実現するためのJavaScriptの具体的なコードを参考までに共有...
目次序文for文の無限ループを修正while文の無限ループを修正要約する序文Js デッド ループはど...
前回の記事では、Vue で画像の切り抜きや拡大・縮小、回転を実現する方法を紹介しました。今回は、アイ...
プロジェクトシナリオ: Dark Horse Vueプロジェクト管理の実践、製品分類の取得、拡張バー...
目次1. デジタルオペレーション(1)指定された範囲内で乱数を生成する2. 配列操作(1)配列の順序...
目次1. Dockerをインストールする2. コードを書く3. Dockerfileを書く4. 画像...
2008年5月12日に四川省汶川市で発生した地震により、多くの命が失われ、遺憾なことと存じます。国務...
目次1. 問題2. 解決策1. オブジェクトをanyとして宣言する2. オブジェクトのインターフェー...