一、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