最近在看 event loop,然后为了搞清楚,写了几行代码,发现输出的结果与我理解的不一样。
上代码:

输出结果:

代码贴出来:
var fs = require('fs');
fs.readFile('test.txt', function(err, data){
console.log('io')
})
setTimeout(function(){
console.log('timer')
})
var a;
console.time('process')
for(var i = 9000000000; i > 0; i--) {
a = 1;
}
console.timeEnd('process')
setImmediate(function(){
console.log('setImmediate')
})
我的理解:
- 走到第 3 行,fs 异步操作进入 Event Table,注册相应函数
- 走到第 7 行,setTimeout 进入 Event Table,注册相应函数
- 走到 for 循环,虽然是同步代码,但是耗时较长。在 for 循环跑完之前,setTimeout 应该先计时完成,把注册的函数移入宏任务队列,随后 fs 的异步事件也完成,把相应的函数移入宏任务队列。
- for 循环终于跑完了(从打印结果看大概 10s 左右),代码走到 18 行,setImmediate 进入 Event Table,注册相应函数,随后把相应函数移入宏任务队列。
- 至此,第一轮事件循环结束,宏任务队列里的先后顺序应该是 timer,io,setImmediate。但是实际打印的顺序却是 timer,setImmediate,io。请问我在哪一步理解出错了。
)