iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Modern Web

Node.js 非專業解說系列 第 8

DAY8: process.nextTick( )

今天的介紹的也是屬於Node的基礎。

process.nextTick 依照Node官網的解說,事實上它並非事件循環的一部份,但process.nextTick的回調方法是由事件循環所調用。process.nextTick所屬名為nextTickQueue的佇列,在任一階段,只要nextTickQueue不是空的,會在當下的階段結束後,優先執行裡面的回調函數完後事件循環再接續執行後續的程序。

簡單來說,process.nextTick是個異步的行為,而這個"行為"在當下的階段結束後才會執行這個"行為"的動作。
例子:

//process.nextTcik
process.nextTick(()=>
{
  console.log("Hello!! I'm Nicole!! I'm NO.1 ")
},);

console.log("GoodBye!! Nicole!!  I'm NO.2");

執行結果:

https://ithelp.ithome.com.tw/upload/images/20210920/20140244l0owFyrbPu.jpg

是的!在process.nextTick()中要輸出的語句放在回調中執行,故先輸出log的語句。
OK!我就喜歡多多嘗試一些不一樣的東西,那如果現在有多個process.nextTick()
那麼誰會被先執行誰又會在後面呢?
例子:

//多個process.nextTcik
process.nextTick(()=>
{
  console.log("Hello!! I'm Nicole!! I'm NO.1 ");
},);

process.nextTick(()=>
{
    console.log("Nice to meet you,Nicole!! I'm NO.2 ");
});

process.nextTick(()=>
{
    console.log("I love you,Nicole!! I'm NO.3 ");
});

console.log("GoodBye!! Nicole!!  I'm NO.4);

執行結果:

https://ithelp.ithome.com.tw/upload/images/20210920/20140244niBsuOTLSK.jpg

從結果可以看到,先執行完log後,接著執行process.nextTick()
而第一個印出的是"Hello!! I'm Nicole!! I'm NO.1" ,第二個是"Nice to meet you,Nicole!! I'm NO.2",
第三個是"I love you,Nicole!! I'm NO.3"。
而輸出的順序也是如此,這就是佇列的特性。
總之process.nextTick()先進入的回調會先被執行,這個特性也就是FIFO。

利用上面的例子,我在第二個process.nextTick()中,讓它發生無限循環(阻塞),
看看執行結果:

//阻塞的process.nextTcik
process.nextTick(()=>
{
  console.log("Hello!! I'm Nicole!! I'm NO.1 ");
},);

process.nextTick(()=>
{
    console.log("Nice to meet you,Nicole!! I'm NO.2 ");
    while(true){} //出現無限循環!!!
});

process.nextTick(()=>
{
    console.log("I love you,Nicole!! I'm NO.3 ");
});

console.log("GoodBye!! Nicole!!  I'm NO.4");

執行結果:

https://ithelp.ithome.com.tw/upload/images/20210920/20140244yWNhKxbeTw.jpg

從結果可以看到第三個process.nextTick()要執行的回調被阻塞住了,
是因為第二個process.nextTick()發生了阻塞無法跳脫。就像水槽被堵住了,那麼我再倒東西進去依然流不下去。

結論:
若nextTick回調方法發生阻塞了,那麼後面佇列中的回調也都會因此阻塞。


上一篇
DAY7: Node 的事件循環 (Event loop)
下一篇
DAY9: setImmediate 與 nextTick的比較
系列文
Node.js 非專業解說30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言