全面了解setImmediate

一、setImmediate和setTimeout的區別

setTimeout是瀏覽器常用的一個定時器函數,但它的延時可能不完全準確,會受到系統性能和瀏覽器工作的影響。而setImmediate則是Node.js在v0.10版本及以後推出的一個函數,用於產生一個非同步操作,它的執行時機是在本輪事件輪詢的結束階段,即setTimeout/setInterval執行的定時器器觸發時機之前。

舉個例子,假如一旦你有一個需求,需要斷斷續續的往服務端傳送數據,其中每一次傳送的間隔可以是1s,在這種情況下,我們可以用setTimeout來實現循環發送數據,代碼如下:

setData()
function setData(){
    // 模擬的數據上傳的操作
    console.log(`Upload data at ${new Date().toLocaleString()}`)
    // 需要隔1s傳一次數據
    setTimeout(setData, 1000)
}

上面的代碼可以實現每隔1秒上傳一次數據的需求,但是它的優先順序是在定時器觸發完成之後。如果在觸發定時器的同時,頁面上又觸發了其他事件,控制權就會被劃分到下一個事件輪詢,這就可能導致定時器在1000ms後才能觸發。而setImmediate是在每輪事件輪詢結束階段執行,能夠保證程序的更高優先順序,假如我們把上面的代碼改為使用setImmediate:

setImmediate(setData)
function setData(){
    // 模擬的數據上傳的操作
    console.log(`Upload data at ${new Date().toLocaleString()}`)
    // 需要隔1s傳一次數據
    setImmediate(setData)
}

這樣就可以在更高優先順序的情況下實現每隔一秒上傳數據了。

二、setImmediate和setTimeInterval的區別

如果將setImmediate和setTimeInterval進行對比,實際上明顯的不同之處就是其在事件隊列中的執行時機。setImmediate的優先順序更高,會在當前事件的尾部掛載,而setTimeInterval則會在事件隊列中等到當前所有任務都完成之後再繼續執行下一個處理器。下面的代碼展示了一個使用兩個定時器的示例:

setImmediate(() => {
    console.log(`setImmediate at ${new Date().toLocaleString()}`)
})

setInterval(() => {
    console.log(`setInterval at ${new Date().toLocaleString()}`)
}, 0)

執行上面的代碼,會輸出如下結果:

setImmediate at 23:47:18
setInterval at 23:47:18
setInterval at 23:47:18
setInterval at 23:47:18
...

上面的結果展示了setImmediate在setTimeout執行之前開始了,而setInterval在第一個事件處理完成之後才開始執行。

三、setImmediate MDN

setImmediate()方法創建一個立即執行的計時器,它為事件循環系統提供了一個執行時間回調的更良好的方式,即避免了在下一次事件輪詢之前執行延時回調時帶來的副作用。通常,使用setImmediate()比使用setTimeout()帶有更高的性能,因為它不需要設置任何定時器。以下是具有一定參考價值的MDN代碼示例:

console.log('start')

setImmediate(() => {
  console.log('immediate')
})

setTimeout(() => {
  console.log('timeout')
}, 0)

console.log('end')

在上面的代碼中,setImmediate回調的執行優先順序更高,所以’Immediate’的log輸出優先顯示。

四、immediate副詞

最後一個和setImmediate相關的話題是immediate副詞。這個副詞會在事件循環結束時(當前運行在 Node.js v0.10 或更高版本的情況下)立即被調用。當已經運行了回調處理時,immediate副詞就不會被再調用。下面是一個例子:

setImmediate(() => {
  console.log('setImmediate')
})

process.immediate(() => {
  console.log('process.immediate()')
})

上面的代碼將分別在事件循環結束時和立即調用immediate副詞的process.nextTick()方法中來顯示它們的輸出。如果你嘗試在同一事件循環中多次調用它們,你會發現immediate副詞只會被調用一次。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/304289.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演著非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28
  • 瘋狂Python講義的全面掌握與實踐

    本文將從多個方面對瘋狂Python講義進行詳細的闡述,幫助讀者全面了解Python編程,掌握瘋狂Python講義的實現方法。 一、Python基礎語法 Python基礎語法是學習P…

    編程 2025-04-28
  • 全面解析Python中的Variable

    Variable是Python中常見的一個概念,是我們在編程中經常用到的一個變數類型。Python是一門強類型語言,即每個變數都有一個對應的類型,不能無限制地進行類型間轉換。在本篇…

    編程 2025-04-28
  • Zookeeper ACL 用戶 anyone 全面解析

    本文將從以下幾個方面對Zookeeper ACL中的用戶anyone進行全面的解析,並為讀者提供相關的示例代碼。 一、anyone 的作用是什麼? 在Zookeeper中,anyo…

    編程 2025-04-28
  • Switchlight的全面解析

    Switchlight是一個高效的輕量級Web框架,為開發者提供了簡單易用的API和豐富的工具,可以快速構建Web應用程序。在本文中,我們將從多個方面闡述Switchlight的特…

    編程 2025-04-28
  • Python合集符號全面解析

    Python是一門非常流行的編程語言,在其語法中有一些特殊的符號被稱作合集符號,這些符號在Python中起到非常重要的作用。本文將從多個方面對Python合集符號進行詳細闡述,幫助…

    編程 2025-04-28

發表回復

登錄後才能評論