- 发布时间
异步
- 作者

- Name
- wenjuGao
- github
- @Github
关于事件循环流程分解如下:
宿主环境为javascript 创建线程时,会创建堆 (heap) 和栈 (stack) ,堆内存储 javascript 对象,栈内存储执行上下文;
栈内执行上下文的同步任务按序执行,执行完即退栈,而当异步任务执行时,该异步任务进入等待状态(不入栈),同时通知线程:当触发该事件时(或该异步操作响应返回时),需向消息队列插入一个事件消息;
当事件触发或响应返回时,线程向消息队列插入该事件消息(包含事件及回调);
当栈内同步任务执行完毕后,线程从消息队列取出一个事件消息,其对应异步任务(函数)入栈,执行回调函数,如果未绑定回调,这个消息会被丢弃,执行完任务后退栈;
当线程空闲(即执行栈清空)时继续拉取消息队列下一轮消息(next tick ,事件循环流转一次称为一次 tick )。
并发模型与事件循环 Concurrency model and the event loop
浏览器中的事件循环
- 函数的执行顺序实现:函数调用栈、任务队列(task queue)
- 一个线程中,事件循环是唯一,任务队列可以拥有多个
任务队列:
- 宏任务macro-task:
- script(整体代码)
- setTimeout
- setInterval
- setImmediate
- I/O
- UI render
- 微任务micro-task:
- process.nextTick
- Promise
- Async/Await(实际就是promise)
- MutationObserver(html5新特性)
先执行宏任务,然后执行该宏任务产生的微任务,若微任务在执行过程中产生了新的微任务,则继续执行微任务,微任务执行完毕后,再回到宏任务中进行下一轮循环
node 11:
输入数据阶段(incoming data) -> 轮询阶段(poll) -> 检查阶段(check) -> 关闭事件回调阶段(close callback) -> 定时器检测阶段(timers) -> I/O事件回调阶段(I/O callbacks) -> 闲置阶段(idle, prepare) -> 轮询阶段(poll)
node io密集型
http无状态协议
webpack gulp