1. 程式人生 > >node.js setImmediate() vs setTimeout()

node.js setImmediate() vs setTimeout()

var fs = require('fs');

fs.readFile('file.txt', () => {
  setImmediate(() => {
    console.log('setImmediate');
    
  });
  setTimeout(() => {
    console.log('setTimeout');
  }, 0);
 console.log(3);
});

process.nextTick(()=>{
  console.log('nextTick3');
})

// 輸出
nextTick3
3
setImmediate
setTimeout
'use strict';
var fs = require('fs');

fs.readFile('file.txt', () => {
  
 console.log(3);
});
setImmediate(() => {
  console.log('setImmediate');
  
});
setTimeout(() => {
  console.log('setTimeout');
}, 0);
process.nextTick(()=>{
  console.log('nextTick3');
})


//
輸出:

nextTick3
setTimeout
setImmediate
3
在node中,計時器的時間是精確到秒的,所以setTimeout(cb, 0) === setTimeout(cb, 1)。 EL初始化是需要耗時的,但是hrtime這個值精確到納秒級別,所以整個指令碼執行會發生以下兩種情況:

1、loop準備時間超過1ms,那麼loop->time >=1,就會發生uv_run_timers。

2、loop準備時間小於1ms,那麼loop->time<1,uv_run_timers不生效,就會直接到後面的check階段去。

而如果有fs的情況下,直接走的是uv__io_poll,觸發回撥之後,直接走check,在走timer階段。


作者:laihuamin
連結:https://juejin.im/post/5bd989705188257f6c43e3fd
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。