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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。