この記事では、js でのイベント ループ (EventLoop) について詳しく説明します (コード付き)。必要な方は参考にしていただければ幸いです。
イベントループを学ぶ前に、js のシングルスレッドと非同期性について復習する必要があります。
js はシングルスレッドですが、ブラウザーと Node.js で適切に処理されます。ブラウザーの Web ワーカー (ワーカー スレッド) や Node の child_process (子プロセス) などです。それらの出現により、大量の計算の分解が容易になりました。
プロセスが開始されると、Node は内部オブザーバーを使用して、処理する必要のあるイベントがあるかどうかを確認し、イベントとそれに関連するコールバック関数を作成します。実行のために取り出された後、次のループに入り、それ以上ない場合はプロセスを終了します。
メインスレッドUIのレンダリングをブロックしないように、ブラウザのワーカースレッドに非同期イベントを入れます
console.log('进程开始') const ajax = new XMLHttpRequest() ajax.addEventListener('load', () => { console.log('load') }) ajax.addEventListener('loadend', () => { if (ajax.readyState == 4 && ajax.status == 200) { console.log('ajax success') } else { console.log('ajax success') } }) ajax.open('get', 'http://localhost/study/html/vue.js') ajax.send() setTimeout(() => { console.log('setTimeout') }, 300) fetch('http://localhost/study/html/demo.json',{ headers: { 'content-type': 'application/json' } }).then(res => { console.log('fetch') }) let i = 0 while(i < 10000) { i++ } console.log(i) console.log('进程结束')
結果から、3つの非同期プロセスが実行をブロックしていないことがわかりますajax、fetch、setTimeout はコード処理が終了した順序に従ってコールバック関数を実行します。
Node内のイベントループはオブザーバーの優先度に従って実行されます
setTimeout(() => { console.log('setTimeout') }, 0) setImmediate(() => { console.log('setImmediate1') process.nextTick(() => { console.log('setImmediate1 插入nextTick') }) }) setImmediate(() => { console.log('setImmediate2') }) process.nextTick(() => { setTimeout(() => { console.log('nextTick1 setTimeout') }, 100) console.log('nextTick1') }) process.nextTick(() => { console.log('nextTick2') }) console.log('正常执行')
関連する推奨事項:
JavaScriptのイベントループメカニズムを詳しく説明する - レクチャー2
Node.jsのイベントループとコールバック関数を深く理解する
以上がNode.js のイベント ループ (EventLoop) の詳細な紹介 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。