setTimeout、setImmediate、process.nextTick,區別
阿新 • • 發佈:2018-12-22
setImmediate() vs setTimeout()區別:
setImmediate()和setTimeout()是很相似的,由於他們被呼叫的時機不同從而他們的行為不同。
setImmediate(),一旦poll階段完成,就立即執行的指令碼程式碼。
setTimeout(),在給定的閾值之後儘可能快的執行。
process.nextTick()
你可能已經意識到process.nextTick()並沒有顯示出來。即使他是非同步api的一部分,這是因為nextTick不是
事件迴圈的一部分,相反,在當前操作完成後,nextTickQueue將被處理,而不管事件迴圈的當前階段如何。
在事件迴圈以前我們要執行nextTick,這能因此一些不好的方面,這樣會在你遞迴執行nextTick是把I/O程序
完全阻塞掉,從而組織事件迴圈到達poll階段。
為什麼要這樣做呢?
為什麼在node中允許這樣做呢?這樣做的部分原因是源於這樣的設計哲學:所有的api必須是非同步的即使他不
需要非同步,我們允許使用者程式碼執行的情況下給使用者傳遞一個錯誤,
apiCall()總是在使用者剩餘的程式碼之後和允許事件迴圈繼續之前執行它的回撥,允許JS呼叫堆疊展開,然後立
即執行提供的回撥,該回調允許人員對process.nextTick()進行遞迴呼叫,從而實現瞭解決“超過v8的最大
呼叫堆疊大小”的問題。
為什麼要使用process.nextTick()?
這裡有兩個主要的原因
1.允許使用者在事件迴圈開始之前,處理錯誤,清理不必要的資源,或者從新嘗試連線。
2.有時在呼叫堆疊繫結之後,在事件迴圈開始之前,執行回撥是很有必要的。