nodejs 事件循环
经常面试喜欢问js的事件循环和node的区别
node的比js的可要复杂一点
先说一下js的,我只说10版本之后的,就不包括浏览器环境一些api了
个人理解的分类为
js 整个脚本代码 全局代码
js 异步事件: 各种的回调函数
异步事件分为宏任务-微任务
宏任务:
异步事件 (例如鼠标点击、键盘按键) 级别高
setTimeOut setInterval 请求的回调
微任务:
promise then catch
整个流程代码是从上到下执行
举个白话的例子说明一下:
可以这么理解,执行顺序就像是考试做题,正常从上往下做,遇到不会的,难题(异步任务),拿两张新纸记录下来
稍难(微任务) 的一张,
特别难(宏任务) 的一张,
当前简单的做完了以后,拿过来稍难(微任务)得继续做,重复没有稍难的就拿过来特别难的,最终做完为止
就是在每一轮代码执行的过程最后都会把这一轮所产生的所有微任务执行完之后再进行下一轮开始
代码执行题可以看我文章
https://juejin.cn/post/7231484081367203897
好了我们说正题了—nodejs的事件循环题 6个阶段
1,timers(定时器)阶段:在这个阶段,执行所有的setTimeout和setInterval回调。
2,pending callbacks阶段:在此阶段,执行那些在事件循环的早期阶段注册的回调。
3,idle, prepare阶段:这是node内部执行阶段。
4,poll(轮询)阶段:此阶段主要负责检索新的I/O事件。
5,check(检查)阶段:此阶段在轮询阶段之后,如果在轮询阶段没有设置timer,且轮询队列不为空,event loop将同步执行queue里面的回调,直到轮询队列为空。如果设置了setImmeadiate,poll queue将进入check阶段;如果没设定setImmeadiate,则会阻塞在poll queue阶段。
6,close callbacks阶段:在此阶段,执行关闭回调。
一直在poll队列等待
1,代码都是在调用栈执行, 如果时间到了把对应各队列的回调推入事件循环里
执行顺序是
从上到下
nextTick -》微任务 promise ->然后到事件循环(timer poll(这里处理I/O文件操作,所有操作完会回到这里等待) check)
更详细的可以看我的掘金https://juejin.cn/post/7296089060833853455
推荐博文
https://www.ruanyifeng.com/blog/2018/02/node-event-loop.html
版权声明:本文由Web学习之路发布,如需转载请注明出处。