node.js setImmediate() vs setTimeout()
阿新 • • 發佈:2018-12-18
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 來源:掘金 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。