鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ node 文檔找提到 setTimeout/setImmediate 返回結(jié)果的

node 文檔找提到 setTimeout/setImmediate 返回結(jié)果的順序不一定。 那么兩種可能性的分別是怎樣的?

參考鏈接

---- 更新一下問(wèn)題。

那么這種兩種可能性分別在什么情況下才會(huì)發(fā)生?

我看了一下阮老師的文章,對(duì)于這個(gè)問(wèn)題又有了一些的新的理解:

clipboard.png

  1. 在主進(jìn)程中, setTimeout 和 setImmediate 執(zhí)行的先后問(wèn)題,
clipboard.png
確實(shí),存在一個(gè)默認(rèn)最小間隔為1ms的問(wèn)題,那么如果 setImmediate 能夠在1ms來(lái)被觸發(fā),就會(huì)比 setTimeout 快。
  1. 為什么在 i/o cycle 中, setImmediate 一定比 setTimeout 快?

因?yàn)樵趫?zhí)行 i/o cycle 過(guò)程中, 進(jìn)入了 poll phase,執(zhí)行其 回調(diào)函數(shù)中的代碼,分別遇到了 setTimeout 和 setImmediate。此時(shí)的 poll phase 的隊(duì)列尚為被清空,還有一個(gè)函數(shù)在里面(執(zhí)行中)。當(dāng)這個(gè)函數(shù)結(jié)束的時(shí)候,整個(gè)event loop 中剛剛通過(guò) setImmediate 注冊(cè)了一個(gè)回調(diào),所以就會(huì)繼續(xù)到 check phase。 這也是為什么
Timers phase 在 check phase 前面,但是 setImmediate 卻在一定會(huì)在 setTimeout 前面執(zhí)行(同一i/o cycle 時(shí))。

當(dāng)然以上是我個(gè)人的理解。

在看了 @改名字很傷神 推薦的 nodejs中的event loop 后,覺(jué)得自己的基礎(chǔ)功還是不扎實(shí),沒(méi)有辦法更加深入的去理解問(wèn)題,汗顏。

同時(shí),歡迎大家就我的看法做指正。

回答
編輯回答
夏夕
setTimeout/setImmediate 返回結(jié)果的順序不一定。 那么兩種可能性的分別是怎樣的?

那當(dāng)然,你都沒(méi)法保證是不是同一次輪詢(xún)(你可能是問(wèn)這個(gè)?)。這就是為什么后面要加fs.readFile。

2018年8月31日 07:51
編輯回答
安若晴

我自己也來(lái)回答一下,雖然是我自己?jiǎn)柕摹?/p>

這個(gè)問(wèn)題放在node下面來(lái)看的話(huà),可以這么理解,

setTimeout 和 setImmediate 這兩個(gè)函數(shù)不存在誰(shuí)前誰(shuí)后的關(guān)系,只不過(guò)在 node 的 event loop 下,

兩者分屬不同的階段(phase):

setTimeout -> timer

setImmediate -> check

這兩個(gè)階段在同一個(gè) Loop 中確實(shí)有先后關(guān)系,但是如果是多個(gè) Loop 則不存在先后關(guān)系。

2018年1月21日 21:19
編輯回答
維她命

文檔寫(xiě)得很明白,當(dāng)setTimeout() 和 setImmediate() 都不在I/O cycle (讀寫(xiě)周期)內(nèi),它們的執(zhí)行順序會(huì)受到程序的性能影響而變得不確定。

For example, if we run the following script which is not within an I/O
cycle (i.e. the main module), the order in which the two timers are
executed is non-deterministic, as it is bound by the performance of
the process.

但是,如個(gè)它們都在I/O cycle內(nèi),則不管有多少個(gè)setTimeout(),setImmediate()永遠(yuǎn)先執(zhí)行,這同時(shí)是setImmediate()的優(yōu)勢(shì)。

The main advantage to using setImmediate() over setTimeout() is
setImmediate() will always be executed before any timers if scheduled
within an I/O cycle, independently of how many timers are present.

參考鏈接

2017年6月26日 07:28