关于 event loop,我有点懵。

2019-02-19 15:45:40 +08:00
 daguaochengtang

最近在看 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')
})

我的理解:

  1. 走到第 3 行,fs 异步操作进入 Event Table,注册相应函数
  2. 走到第 7 行,setTimeout 进入 Event Table,注册相应函数
  3. 走到 for 循环,虽然是同步代码,但是耗时较长。在 for 循环跑完之前,setTimeout 应该先计时完成,把注册的函数移入宏任务队列,随后 fs 的异步事件也完成,把相应的函数移入宏任务队列。
  4. for 循环终于跑完了(从打印结果看大概 10s 左右),代码走到 18 行,setImmediate 进入 Event Table,注册相应函数,随后把相应函数移入宏任务队列。
  5. 至此,第一轮事件循环结束,宏任务队列里的先后顺序应该是 timer,io,setImmediate。但是实际打印的顺序却是 timer,setImmediate,io。请问我在哪一步理解出错了。
4990 次点击
所在节点    Node.js
22 条回复
dcatfly
2019-02-21 13:11:56 +08:00
@nikolausliu ok thx.
joseph111
2019-03-20 13:49:26 +08:00
看下这篇博客 http://blog.jessica.group/program/nodejs/async.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536584

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX