
JS把异步任务分为宏任务与微任务。
| 任务(代码) | 宏任务 | 环境 |
|---|---|---|
| script | 宏任务 | 浏览器 |
| 事件 | 宏任务 | 浏览器 |
| 网络请求(Ajax/Fetch) | 宏任务 | 浏览器 |
| setTimeout()/setInterval() | 宏任务 | 浏览器 |
| 任务(代码) | 微任务 | 环境 |
|---|---|---|
| Promise的then | 微任务 | JS引擎 |
| nextTick | 微任务 | JS引擎 |
| await右结合和下方的代码 | 微任务 | JS引擎 |
Promise本身同步,then/catch的回调函数是异步的
同步代码(js执行栈/回调栈)
微任务的异步代码(js引擎)
宏任务的异步代码(宿主环境)
运行顺序:同步>微任务>宏任务
在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下:
一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。
面试题目讲解可以参考视频:https://www.bilibili.com/video/BV1G84y1B7hZ?vd_source=5053a6dbc1b42e83bb14303fbfead9a2