日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

node.js中对Event Loop事件循环的理解

發布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node.js中对Event Loop事件循环的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

javascript是單線程的,所以任務的執行都需要排隊,任務分為兩種,一種是同步任務,一種是異步任務。

同步任務是進入主線程上排隊執行的任務,上一個任務執行完了,下一個任務才會執行。

異步任務是不進入主線程,而是進入一個 "任務隊列" 里,"任務隊列" 通知主線程,該異步任務才會進入主線程執行。

任務的運行機制如下:

1、所有同步任務在主線程上執行,形成一個 "執行棧",注意棧是先進后出的。

2、主線程外,有一個 "任務隊列" ,只要異步任務處理完有結果了,就在 "任務隊列" 中放置一個事件,注意隊列是先進先出的。

3、一旦 "執行棧" 中所有同步任務執行完畢。系統讀取 "任務隊列" 中的事件,對應的異步任務。放入 "執行棧" 中,開始執行。

4、主線程不斷重復第三步,這種循環從 "任務隊列" 中讀取事件處理的這種運行機制稱為Event Loop(事件循環)。

"執行棧" 中的同步代碼總是比 "任務隊列"中的異步任務之前運行。

function fun() {setTimeout(function () {console.log('異步任務');}, 0);console.log(1);console.log(2);console.log(3);console.log(4);console.log(5); } fun();

上面的代碼,console.log代碼寫在setTimeout后面,但仍然先執行。

"任務隊列" 是一個隊列,隊列的特性是先進先出??聪旅娲a:

function fun() {console.log(1);setTimeout(function () {console.log(2);setTimeout(function () {console.log(3);}, 0);}, 0);console.log(4); } fun();

輸出結果為 1? 4? 2? 3,打印 2 的setTimeout任務比打印 3 的setTimeout任務先進入隊列,所以會先運行。

對于異步操作,像ajax,只有操作成功后返回結果,才會進入 "任務隊列" 中,而不是調用的時候就放入隊列中??聪旅娲a:

<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <script>function ajax() {var xhr = new XMLHttpRequest();xhr.open('GET', 'https://mail.163.com/', true);xhr.send();xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {console.log(xhr.responseText);}};}function fun() {console.log(1);ajax();setTimeout(function () {console.log(2);}, 1000);console.log(3);}fun(); </script> </body> </html>

ajax() 與 setTimeout 誰先進入隊列,誰先輸出,是需要看兩者消耗時間,誰更短。時間短的會先進入隊列先運行。

setTimeout 與?setInterval 運行機制一樣,都是在指定時間把事件插入到 "任務隊列" 尾部。區別是前者只執行一次,后者可反復執行。

node.js 還為我們提供了,process.nextTick 和?setImmediate 與 "任務隊列" 有關的方法。

process.nextTick 會把回調函數放在當前 "執行棧" 的尾部。也就是說是在讀取 "任務隊列" 之前運行。

function fun() {console.log(1);setTimeout(function () {console.log(2);}, 0);process.nextTick(function () {console.log(3);process.nextTick(function () {console.log(4);});});process.nextTick(function () {console.log(5);});console.log(6); } fun();

上面的代碼會輸出 1? 6? 3? 5? 4? 2 ,注意process.nextTick會把回調函數放在 "執行棧" 的尾部。

同步代碼最先輸出 1? 6,然后 3 的先放入尾部,然后 5 的跟在 3 后面。3先執行,然后把 4 放入到 5 的后面。5執行完后,再執行4,最后讀取 "任務隊列" 中的輸出2。

setImmediate 會把回調函數放在當前 "任務隊列" 的尾部。也就是下一次事件循環Event Loop時執行。

function fun() {console.log(1);setTimeout(function () {console.log(2);}, 0);setImmediate(function () {console.log(3);});console.log(4); } fun();

上面的代碼是會輸出 1? 4? 2? 3 還是 1? 4? 3? 2 是不確定的,因為setTimeout 與?setImmediate 都會在下一次事件循環Event Loop中觸發,所以輸出是不確定的。

轉載于:https://www.cnblogs.com/jkko123/p/10222859.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的node.js中对Event Loop事件循环的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。