<progress id="3f9vx"></progress>
    <noframes id="3f9vx"><track id="3f9vx"><b id="3f9vx"><menuitem id="3f9vx"></menuitem></b></track>

    <span id="3f9vx"><mark id="3f9vx"><mark id="3f9vx"></mark></mark></span>

    <track id="3f9vx"></track>
      <font id="3f9vx"><dfn id="3f9vx"></dfn></font>

        <noframes id="3f9vx"><ins id="3f9vx"><cite id="3f9vx"></cite></ins>
        <form id="3f9vx"><font id="3f9vx"></font></form>

          千鋒教育-做有情懷、有良心、有品質的職業教育機構

          手機站
          千鋒教育

          千鋒學習站 | 隨時隨地免費學

          千鋒教育

          掃一掃進入千鋒手機站

          領取全套視頻
          千鋒教育

          關注千鋒學習站小程序
          隨時隨地免費學習課程

          【熱點話題】 零基礎學IT IT學習教程 IT學習筆記 IT技術干貨 IT培訓機構 IT應聘面試 IT職場就業 Java培訓機構哪些好
          當前位置:首頁  >  關于學院  >  技術干貨  > Node中的Event Loop和瀏覽器中的有什么區別?process.nextTick 執行順序?

          Node中的Event Loop和瀏覽器中的有什么區別?process.nextTick 執行順序?

          來源:千鋒教育
          發布人:wjy
          時間: 2022-10-19 16:59:43 1666169983

            Node 中的 Event Loop 和瀏覽器中的是完全不相同的東西。

            Node 的 Event Loop 分為 6 個階段,它們會按照順序反復運行。每當進入某一個階段的時候,都會從對應的回調隊列中取出函數去執行。當隊列為空或者執行的回調函數數量到達系統設定的閾值,就會進入下一階段。

          Node 中的 Event Loop 和瀏覽器中的有什么區別1

            (1)Timers(計時器階段):初次進入事件循環,會從計時器階段開始。此階段會判斷是否存在過期的計時器回調(包含 setTimeout 和 setInterval),如果存在則會執行所有過期的計時器回調,執行完畢后,如果回調中觸發了相應的微任務,會接著執行所有微任務,執行完微任務后再進入 Pending callbacks 階段。

            (2)Pending callbacks:執行推遲到下一個循環迭代的I / O回調(系統調用相關的回調)。

            (3)Idle/Prepare:僅供內部使用。

            (4)Poll(輪詢階段):

            當回調隊列不為空時:會執行回調,若回調中觸發了相應的微任務,這里的微任務執行時機和其他地方有所不同,不會等到所有回調執行完畢后才執行,而是針對每一個回調執行完畢后,就執行相應微任務。執行完所有的回調后,變為下面的情況。

            當回調隊列為空時(沒有回調或所有回調執行完畢):但如果存在有計時器(setTimeout、setInterval和setImmediate)沒有執行,會結束輪詢階段,進入 Check 階段。否則會阻塞并等待任何正在執行的I/O操作完成,并馬上執行相應的回調,直到所有回調執行完畢。

            (5)Check(查詢階段):會檢查是否存在 setImmediate 相關的回調,如果存在則執行所有回調,執行完畢后,如果回調中觸發了相應的微任務,會接著執行所有微任務,執行完微任務后再進入 Close callbacks 階段。

            (6)Close callbacks:執行一些關閉回調,比如socket.on('close', ...)等。

            下面來看一個例子,首先在有些情況下,定時器的執行順序其實是隨機的

          Node 中的 Event Loop 和瀏覽器中的有什么區別2

            對于以上代碼來說,setTimeout 可能執行在前,也可能執行在后首先 setTimeout(fn, 0) === setTimeout(fn, 1),這是由源碼決定的進入事件循環也是需要成本的,如果在準備時候花費了大于 1ms 的時間,那么在 timer 階段就會直接執行 setTimeout 回調那么如果準備時間花費小于 1ms,那么就是 setImmediate 回調先執行了當然在某些情況下,他們的執行順序一定是固定的,比如以下代碼:

          Node 中的 Event Loop 和瀏覽器中的有什么區別3

            在上述代碼中,setImmediate 永遠先執行。因為兩個代碼寫在 IO 回調中,IO 回調是在 poll 階段執行,當回調執行完畢后隊列為空,發現存在 setImmediate 回調,所以就直接跳轉到 check 階段去執行回調了。

            上面都是 macrotask 的執行情況,對于 microtask 來說,它會在以上每個階段完成前清空 microtask 隊列,下圖中的 Tick 就代表了 microtask

          Node 中的 Event Loop 和瀏覽器中的有什么區別4

          Node 中的 Event Loop 和瀏覽器中的有什么區別5

            對于以上代碼來說,其實和瀏覽器中的輸出是一樣的,microtask 永遠執行在 macrotask 前面。最后來看 Node 中的 process.nextTick,這個函數其實是獨立于 Event Loop 之外的,它有一個自己的隊列,當每個階段完成后,如果存在 nextTick 隊列,就會清空隊列中的所有回調函數,并且優先于其他 microtask 執行。

          Node 中的 Event Loop 和瀏覽器中的有什么區別6

            對于以上代碼,永遠都是先把 nextTick 全部打印出來。

          聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。

          10年以上業內強師集結,手把手帶你蛻變精英

          請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通

          免費領取

          今日已有369人領取成功

          劉同學 138****2860 剛剛成功領取
          王同學 131****2015 剛剛成功領取
          張同學 133****4652 剛剛成功領取
          李同學 135****8607 剛剛成功領取
          楊同學 132****5667 剛剛成功領取
          岳同學 134****6652 剛剛成功領取
          梁同學 157****2950 剛剛成功領取
          劉同學 189****1015 剛剛成功領取
          張同學 155****4678 剛剛成功領取
          鄒同學 139****2907 剛剛成功領取
          董同學 138****2867 剛剛成功領取
          周同學 136****3602 剛剛成功領取

          猜你喜歡LIKE

          最新文章NEW

          相關推薦HOT

          更多>>

          快速通道 更多>>

          開班信息
          北京校區
          • 北京校區
          • 大連校區
          • 廣州校區
          • 成都校區
          • 杭州校區
          • 長沙校區
          • 合肥校區
          • 南京校區
          • 上海校區
          • 深圳校區
          • 武漢校區
          • 鄭州校區
          • 西安校區
          • 青島校區
          • 重慶校區
          • 太原校區
          • 沈陽校區

          乱子伦XXXX欧美

          <progress id="3f9vx"></progress>
            <noframes id="3f9vx"><track id="3f9vx"><b id="3f9vx"><menuitem id="3f9vx"></menuitem></b></track>

            <span id="3f9vx"><mark id="3f9vx"><mark id="3f9vx"></mark></mark></span>

            <track id="3f9vx"></track>
              <font id="3f9vx"><dfn id="3f9vx"></dfn></font>

                <noframes id="3f9vx"><ins id="3f9vx"><cite id="3f9vx"></cite></ins>
                <form id="3f9vx"><font id="3f9vx"></font></form>