前端宏任务和微任务的概念以及使用场景(权威渠道深入了解)

1,知识出处

链接: MDN 这里解释的很清楚了,什么是任务队列(事件循环),微任务,他们的机制和微任务的使用场景有哪些。

2,基于MDN上的解释加以描述

2.1宏任务:

所谓的 宏任务 其实就是js在浏览器中自己的事件循环机制:

同步任务
异步任务
一段需要执行的代码块
包括同步任务和异步任务
继续主线程执行
进入异步队列
执行完成但事件循环并未结束
异步队列任务执行完成等待加入同步队列
将挂起的异步任务同步到主线程继续执行
结束一轮的事件循环(任务队列)

MDN的解释是:
在这里插入图片描述
总结:所以可以认为,所有的包含在事件循环内的代码,不管是同步的还是异步的setTimeout,setInterval这种定时器代码都是属于宏任务的范畴。

2.2微任务:

这里我就不在作图说明了,简单的理解微任务就是,在事件循环结束时,被立即调用的任务。比如: Promise。它的then方法是在事件循环结束时调用的,而不是下次的事件循环开始时调用。还有web提供的公有API:

queueMicrotask(() => {
  /* 微任务中将运行的代码 */
});

是最直接的且没有副作用的微任务发起方式。所谓的副作用是指: 举例来说,当使用 promise 创建微任务时,由回调抛出的异常被报告为 rejected promises 而不是标准异常。同时,创建和销毁 promise 带来了事件和内存方面的额外开销,这是正确入列微任务的函数应该避免的。

注意:宏任务和微任务是独立的执行机制。他们是分开执行的,执行时的上下文环境逻辑是互不干扰的,但是执行顺序会收到彼此的干扰。顺序是这样的:宏任务最先执行(任务事件循环机制) > 结束后立即执行微任务 > 执行新的宏任务。也就是说宏任务会阻塞微任务执行开始前,微任务会阻塞下一次宏任务的开始。

2.3微任务使用场景

简单说一下了,MDN上写的很清楚详细,使用场景有:
1,微任务可被用来确保执行顺序总是一致的一种情形,就是当一个if else语句中如果一个是微任务另一个不是,那么最好保持都是微任务以保证程序的一致性执行,确保不会出现以为的线程竞争等问题。

2,批量操作。使用微任务从不同来源将多个请求收集到单一的批处理中,从而避免对处理同类工作的多次调用可能造成的开销。同样的请求不要多次重复调用,在事件循环结束的时候一起调用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值