国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

node.js中對Event Loop事件循環(huán)的理解與應(yīng)用實(shí)例分析

2024-05-06 15:44:27
字體:
供稿:網(wǎng)友

本文實(shí)例講述了node.js中對Event Loop事件循環(huán)的理解與應(yīng)用。分享給大家供大家參考,具體如下:

javascript是單線程的,所以任務(wù)的執(zhí)行都需要排隊(duì),任務(wù)分為兩種,一種是同步任務(wù),一種是異步任務(wù)。

同步任務(wù)是進(jìn)入主線程上排隊(duì)執(zhí)行的任務(wù),上一個任務(wù)執(zhí)行完了,下一個任務(wù)才會執(zhí)行。

異步任務(wù)是不進(jìn)入主線程,而是進(jìn)入一個 "任務(wù)隊(duì)列" 里,"任務(wù)隊(duì)列" 通知主線程,該異步任務(wù)才會進(jìn)入主線程執(zhí)行。

任務(wù)的運(yùn)行機(jī)制如下:

1、所有同步任務(wù)在主線程上執(zhí)行,形成一個 "執(zhí)行棧",注意棧是先進(jìn)后出的。

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

3、一旦 "執(zhí)行棧" 中所有同步任務(wù)執(zhí)行完畢。系統(tǒng)讀取 "任務(wù)隊(duì)列" 中的事件,對應(yīng)的異步任務(wù)。放入 "執(zhí)行棧" 中,開始執(zhí)行。

4、主線程不斷重復(fù)第三步,這種循環(huán)從 "任務(wù)隊(duì)列" 中讀取事件處理的這種運(yùn)行機(jī)制稱為Event Loop(事件循環(huán))。

"執(zhí)行棧" 中的同步代碼總是比 "任務(wù)隊(duì)列"中的異步任務(wù)之前運(yùn)行。

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

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

"任務(wù)隊(duì)列" 是一個隊(duì)列,隊(duì)列的特性是先進(jìn)先出。看下面代碼:

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

輸出結(jié)果為 1  4  2  3,打印 2 的setTimeout任務(wù)比打印 3 的setTimeout任務(wù)先進(jìn)入隊(duì)列,所以會先運(yùn)行。

對于異步操作,像ajax,只有操作成功后返回結(jié)果,才會進(jìn)入 "任務(wù)隊(duì)列" 中,而不是調(diào)用的時候就放入隊(duì)列中。看下面代碼:

<!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 誰先進(jìn)入隊(duì)列,誰先輸出,是需要看兩者消耗時間,誰更短。時間短的會先進(jìn)入隊(duì)列先運(yùn)行。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 广汉市| 沁阳市| 灯塔市| 抚顺县| 莎车县| 新晃| 西吉县| 桦川县| 东乌珠穆沁旗| 宁都县| 县级市| 南阳市| 稷山县| 巩义市| 乌兰县| 邳州市| 麻江县| 岱山县| 新宁县| 佛学| 敖汉旗| 郯城县| 新龙县| 江孜县| 博野县| 城步| 洛扎县| 东乡县| 左云县| 易门县| 安庆市| 凯里市| 鄂托克旗| 新源县| 汝阳县| 惠水县| 剑阁县| 日土县| 赤壁市| 衡阳市| 太仓市|