最近在看 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。请问我在哪一步理解出错了。

)