最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年02月14日 10:01:11   作者:懷素真  
這篇文章主要介紹了node.js中對(duì)Event Loop事件循環(huán)的理解與應(yīng)用,結(jié)合實(shí)例形式分析了node.js中Event Loop事件循環(huán)相關(guān)原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下

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

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

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

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

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

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

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

3、一旦 "執(zhí)行棧" 中所有同步任務(wù)執(zhí)行完畢。系統(tǒng)讀取 "任務(wù)隊(duì)列" 中的事件,對(duì)應(yīng)的異步任務(wù)。放入 "執(zhí)行棧" 中,開(kāi)始執(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代碼寫(xiě)在setTimeout后面,但仍然先執(zhí)行。

"任務(wù)隊(duì)列" 是一個(gè)隊(duì)列,隊(duì)列的特性是先進(jìn)先出??聪旅娲a:

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ì)列,所以會(huì)先運(yùn)行。

對(duì)于異步操作,像ajax,只有操作成功后返回結(jié)果,才會(huì)進(jìn)入 "任務(wù)隊(duì)列" 中,而不是調(diào)用的時(shí)候就放入隊(duì)列中??聪旅娲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 誰(shuí)先進(jìn)入隊(duì)列,誰(shuí)先輸出,是需要看兩者消耗時(shí)間,誰(shuí)更短。時(shí)間短的會(huì)先進(jìn)入隊(duì)列先運(yùn)行。

setTimeout 與 setInterval 運(yùn)行機(jī)制一樣,都是在指定時(shí)間把事件插入到 "任務(wù)隊(duì)列" 尾部。區(qū)別是前者只執(zhí)行一次,后者可反復(fù)執(zhí)行。

node.js 還為我們提供了,process.nextTick 和 setImmediate 與 "任務(wù)隊(duì)列" 有關(guān)的方法。

process.nextTick 會(huì)把回調(diào)函數(shù)放在當(dāng)前 "執(zhí)行棧" 的尾部。也就是說(shuō)是在讀取 "任務(wù)隊(duì)列" 之前運(yùn)行。

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();

上面的代碼會(huì)輸出 1  6  3  5  4  2 ,注意process.nextTick會(huì)把回調(diào)函數(shù)放在 "執(zhí)行棧" 的尾部。

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

setImmediate 會(huì)把回調(diào)函數(shù)放在當(dāng)前 "任務(wù)隊(duì)列" 的尾部。也就是下一次事件循環(huán)Event Loop時(shí)執(zhí)行。

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

上面的代碼是會(huì)輸出 1  4  2  3 還是 1  4  3  2 是不確定的,因?yàn)閟etTimeout 與 setImmediate 都會(huì)在下一次事件循環(huán)Event Loop中觸發(fā),所以輸出是不確定的。

希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • express啟用https使用小記

    express啟用https使用小記

    這篇文章主要介紹了express啟用https使用小記,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • node.js實(shí)現(xiàn)微信開(kāi)發(fā)之獲取用戶授權(quán)

    node.js實(shí)現(xiàn)微信開(kāi)發(fā)之獲取用戶授權(quán)

    這篇文章主要介紹了node.js實(shí)現(xiàn)微信開(kāi)發(fā)之獲取用戶授權(quán),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • node.js中使用ejs渲染數(shù)據(jù)的代碼實(shí)現(xiàn)

    node.js中使用ejs渲染數(shù)據(jù)的代碼實(shí)現(xiàn)

    這篇文章主要介紹了node.js中使用ejs渲染數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解

    MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解

    這篇文章主要介紹了MQTT Client實(shí)現(xiàn)消息推送功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了MQTT Client實(shí)現(xiàn)消息推送的基本原理、實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • NodeJS如何優(yōu)雅的實(shí)現(xiàn)Sleep休眠

    NodeJS如何優(yōu)雅的實(shí)現(xiàn)Sleep休眠

    這篇文章主要介紹了NodeJS如何優(yōu)雅的實(shí)現(xiàn)Sleep休眠問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 解決node.js中bcrypt遇到的安裝問(wèn)題

    解決node.js中bcrypt遇到的安裝問(wèn)題

    這篇文章主要介紹了解決node.js中bcrypt遇到的安裝問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • nodejs基于express實(shí)現(xiàn)文件上傳的方法

    nodejs基于express實(shí)現(xiàn)文件上傳的方法

    這篇文章主要介紹了nodejs基于express實(shí)現(xiàn)文件上傳的方法,結(jié)合實(shí)例形式分析了nodejs基于express框架實(shí)現(xiàn)文件上傳功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • Node 自動(dòng)化部署的方法

    Node 自動(dòng)化部署的方法

    本篇文章主要介紹了Node 自動(dòng)化部署的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • node.js 如何監(jiān)視文件變化

    node.js 如何監(jiān)視文件變化

    這篇文章主要介紹了node.js 如何監(jiān)視文件變化,幫助大家更好的理解和學(xué)習(xí)node.js,感興趣的朋友可以了解下
    2020-09-09
  • 詳解HTTPS 的原理和 NodeJS 的實(shí)現(xiàn)

    詳解HTTPS 的原理和 NodeJS 的實(shí)現(xiàn)

    這篇文章主要介紹了詳解HTTPS 的原理和 NodeJS 的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論

崇信县| 扶风县| 景洪市| 缙云县| 安仁县| 温泉县| 澄江县| 宝山区| 治县。| 习水县| 慈溪市| 泸州市| 宝山区| 融水| 体育| 游戏| 靖远县| 西丰县| 贵南县| 交城县| 通渭县| 红原县| 准格尔旗| 石门县| 乐昌市| 兴业县| 磴口县| 宜阳县| 巫溪县| 柘城县| 明光市| 修武县| 西峡县| 荃湾区| 太保市| 武平县| 太和县| 政和县| 苗栗县| 呼和浩特市| 新和县|