单线程
-
JS 是单线程的(无论浏览器还是 nodejs)
-
浏览器中的 JS 执行和 DOM 渲染公用一个线程
异步 - 宏任务和微任务
-
宏任务,如:setTimeout、setInterval、网络请求
-
微任务,如:promise、async/await、MutationObserver(监听 dom 树的变化)
-
微任务在下一轮 dom 渲染前执行,宏任务在之后执行(微任务要比宏任务执行的更早一些)
nodejs 异步
-
nodejs 同样使用了 ES 语法,也是单线程,也需要异步
-
异步任务也分:宏任务 + 微任务
-
但是,它的宏任务和微任务,分不同的类型,有不同优先级
nodejs 宏任务类型和优先级(优先级高到低)
-
Timers - setTimeout setInterval
-
I/O callbacks - 处理网络、流、TCP 的错误回调
-
Idle, prepare - 闲置状态(nodejs 内部使用)
-
Poll 轮询 - 执行 poll 中的 I/O 队列
-
Check 检查 - 存储 setImmediate 回调
-
Close callbacks - 关闭回调,如 socket.on("close")
nodejs 微任务类型和优先级
-
包括:promise、async/await、process.nextTick
-
注意,process.nextTick 优先级最高
nodejs event loop
-
执行同步代码
-
执行微任务(process.nextTick 优先级更高)
-
按顺序执行 6 个类型的宏任务(每个开始前都执行当前的微任务)