欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

任務的運行機制如下:

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

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

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

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

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

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后面,但仍然先執(zhí)行。

"任務隊列" 是一個隊列,隊列的特性是先進先出??聪旅娲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 運行機制一樣,都是在指定時間把事件插入到 "任務隊列" 尾部。區(qū)別是前者只執(zhí)行一次,后者可反復執(zhí)行。

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

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

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會把回調函數(shù)放在 "執(zhí)行棧" 的尾部。

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

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

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 都會在下一次事件循環(huán)Event Loop中觸發(fā),所以輸出是不確定的。

希望本文所述對大家node.js程序設計有所幫助。

相關文章

  • Node.js進程退出的深入理解

    Node.js進程退出的深入理解

    NodeJS可以感知和控制自身進程的運行環(huán)境和狀態(tài),也可以創(chuàng)建子進程并與其協(xié)同工作,這使得NodeJS可以把多個程序組合在一起共同完成某項工作,下面這篇文章主要給大家介紹了關于Node.js進程退出的相關資料,需要的朋友可以參考下
    2022-04-04
  • Nodejs+express+ejs簡單使用實例代碼

    Nodejs+express+ejs簡單使用實例代碼

    本篇文章主要介紹了Nodejs+express+ejs簡單使用實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解如何修改 node_modules 里的文件

    詳解如何修改 node_modules 里的文件

    這篇文章主要介紹了詳解如何修改node_modules里的文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Windows系統(tǒng)下使用Sublime搭建nodejs環(huán)境

    Windows系統(tǒng)下使用Sublime搭建nodejs環(huán)境

    最近在研究Nodejs開發(fā),俗話說,工欲善其事,必先利其器,當然要找到一款用著順手的編輯器作為開始。這里我們選擇的是Sublime Text 3,除了漂亮的用戶界面,最吸引我的就是它的插件擴展功能以及跨平臺特性。
    2015-04-04
  • Node實戰(zhàn)之不同環(huán)境下配置文件使用教程

    Node實戰(zhàn)之不同環(huán)境下配置文件使用教程

    這篇文章主要給大家介紹了關于Node實戰(zhàn)之不同環(huán)境下配置文件使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • 詳解webpack打包nodejs項目(前端代碼)

    詳解webpack打包nodejs項目(前端代碼)

    這篇文章主要介紹了webpack打包nodejs項目(前端代碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 從零開始學習Node.js系列教程四:多頁面實現(xiàn)的數(shù)學運算示例

    從零開始學習Node.js系列教程四:多頁面實現(xiàn)的數(shù)學運算示例

    這篇文章主要介紹了Node.js多頁面實現(xiàn)的數(shù)學運算,涉及nodejs請求響應、數(shù)值傳遞、運算等相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • Node.js如何實現(xiàn)注冊郵箱激活功能 (常見)

    Node.js如何實現(xiàn)注冊郵箱激活功能 (常見)

    今天了解了node如何實現(xiàn)郵箱激活功能,這個功能非常常見,當我們注冊一個賬號時,肯定會有這步,下面看下如何實現(xiàn)這個功能
    2017-07-07
  • node?puppeteer爬蟲爬取電影網站及生成pdf文檔示例

    node?puppeteer爬蟲爬取電影網站及生成pdf文檔示例

    這篇文章主要介紹了node?puppeteer爬蟲爬取電影網站及生成pdf文檔使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Node.js中的events事件模塊知識點總結

    Node.js中的events事件模塊知識點總結

    在本篇文章里小編給大家整理的是一篇關于Node.js中的events事件模塊知識點總結內容,有興趣的朋友們可以跟著學習下。
    2021-12-12

最新評論