事件循环、宏任务、微任务一网打尽(附超多经典面试题)( 四 )
本文插图
2.宏任务微任务的执行机制不同
(1)node11之前1)执行完一个阶段所有同类型的宏任务2)执行完nextTick队列里面的内容3)然后执行完微任务队列的内容 , (2)Node11之后宏任务和微任务的执行结果 , 跟浏览器一致了;
- 执行首个宏任务 -> 执行这个宏任务中的所有微任务 -> event loop执行完毕 , 执行下一个eventloop
实际底层的原理不一样 , node中的流程如下:
本文插图
- Node.js中可以理解为4种宏任务队列和2种微任务队列 , 但是执行宏任务时有6个阶段 。 4种宏任务队列:setTimeout 、setInterval 、setImmediate、I/O包括文件和网络2种微任务队列:process.nextTick、 new Promise.then 回调
- Node.js中 , 先执行全局Script代码
- 执行完同步代码后 , 先从微任务队列Next Tick Queue中取出所有的任务放入调用栈中执行
- 再从微任务队列Other Microtask Queue依次取出所有的任务放入调用栈中执行 。
- 然后开始宏任务的6个阶段 , 每个阶段都把宏任务队列中所有任务取出来执行 ,在执行下一阶段的宏任务 , 每一个宏任务完成执行完该宏任务的微任务队列 , 以此来构成事件循环 。
3.相同点
(1)事件循环event loop的目的:处理同步和异步事件的一种事件调度机制;(2)循环是没有终点的 , 只要进程在 , 就会有新任务 , 就会去执行;
二.事件循环的六个阶段
官网的图
本文插图
1.timers定时器:
(1)本阶段执行 setTimeout 和 setInterval 的回调函数 。 (2)事件循环的起点:node服务器启动、setTimeout 和 setInterval 的回调函数、I/O回调函数;
2.pending callbacks:
本阶段执行某些系统操作(比如TCP错误类型)的回调函数;
3.idle, prepare:仅系统内部使用 。
4.poll 轮询:
(1)主要处理异步 I/O 的回调 , 以及除了timers之外几乎所有的回调函数;其余情况 node会在适当时候在此处阻塞 。 (2)异步I/O分为:网络I/O和文件I/O;
poll 是一个至关重要的阶段 , 这一阶段中 , 系统会做两件事情1.回到 timer 阶段执行回调2.执行 I/O 回调(1)在进入该阶段时如果 没有 设定 timer 的话 , 会发生以下两件事情
- 如果 poll 队列 不为空, 会遍历回调队列并同步执行 , 直到队列为空或者达到系统限制
- 狐獴|\非洲精灵\狐獴,毒蝎、眼镜蛇都礼让7分!它有何威名?
- 世界卫生组织|宇宙有哪些高能事件,你知道吗?
- 美团|支付二维码管制,微信、支付宝躺枪,谁是最大赢家?
- 外星人绑架|贝蒂安德烈事件,美国最离奇的外星人绑架案,至今仍是谜?
- 荣耀|荣耀60系列爆料汇总:外观、性能、拍照、续航基本都确认了
- 创业|马云可能也没料到,“电商黑马”出现,拼多多、京东和淘宝难办了
- 百度|派财经 · 一周热闻:工信部因电信网络诈骗约谈阿里云、百度云;腾讯回应APP暂停更新
- 魅族|从3999降至2499,8+256GB、三星定制屏,魅族也有高性价比
- 纳米|用于长距离、超安全的量子通信的纳米天线
- 音箱|人类高质量监听书架音箱推荐,从劲浪、JBL到丹拿,九个品牌简评