JavaScript 之 宏任务,微任务

浏览器是多进程的,js 是由单线程执行的,下面内容需要事件循环的知识,关注我,每天更新技术干货

macro-task (宏)包括:

  • script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。

micro-task (微)包括:

  • process.nextTick, Promises, Object.observe, MutationObserver

注意: setTimeout 有延迟,最少是 4ms

宏任务队列有多个,之间有优先级,优先级高的优先执行,一次事件循环执行一个宏任务。

微任务队列只有一个,一次事件循环中全部执行完毕

执行一个宏任务,然后执行该宏任务期间添加的所有微任务,然后执行一次 UI 渲染。然后再执行一个宏任务,以此往复。

宏任务多个队列对应的数据源:

  • I/O
  • 网络
  • UI 渲染
  • 定时器
  • Promise

接下来看几个例子:

Node 环境执行

输出结果:

首先输出:

main1

Promise 中的函数也是属于同步代码,后面 then 中的才属于异步代码,所以继续输出:

promise

然后输出:

main2

setTimeout 属于下一个宏任务,所以先执行所有该期间微任务。

注意 process.nextTick 优先级比 promise 高(Node 环境),所以先输出:

process.nextTick1

然后输出:

promise then

然后执行下一个宏任务和其期间添加的微任务,即输出:

setTimeout

process.nextTick2

再看一个示例:

输出结果:

和你预测的一样吗?

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();