微任务和宏任务的执行顺序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

宏任务和微任务的来源!

js 是单线程执行的,js中的任务按顺序一个一个的执行,但是一个任务耗时太长;
那么后面的任务就需要等待,为了解决这种情况,将任务分为了同步任务异步任务
而异步任务又可以分为微任务和宏任务。

js的执行顺序

console.log('script start');

setTimeout(function() {
console.log(‘setTimeout’);
}, 0);

Promise.resolve().then(function() {
console.log(‘promise1’);
}).then(function() {
console.log(‘promise2’);
});

console.log(‘script end’);

返回结果的打印顺序是:

script start
script end
promise1
promise2
setTimeout
12345

为什么会打印出这个顺序?(看图)

在这里插入图片描述

关于微任务和宏任务在浏览器中的执行顺序

微任务和宏任务的问题应该是前端面试中比较常见的,他们都从属于异步任务,主要区别在于他们的执行顺序,Event Loop的走向和取值在这里插入图片描述

所以上图的意思就是

1)、存在微任务的话,那么就执行所有的微任务

2)、微任务都执行完之后,执行下一个宏任务

3)、1, 2以此循环着

对于微任务的执行顺序上也有些需要注意的地方

基本上,若你喜欢异步任务尽可能快地执行,那就使用process.nextTick

根据语言规格,Promise对象的回调函数,会进入异步任务里面的**”微任务“(microtask)**队列。

微任务队列追加在process.nextTick队列的后面。也属于本轮循环。

宏任务和微任务的分类

宏任务:

setTimeout

setInterval

js主代码

setImmediate(Node)

requestAnimationFrame(浏览器)

微任务:

process.nextTick

Promise的then方法

代码演示

console.log('script start')
async function async1() { //语法糖 async2()执行完毕 才执行下面 会加入在微观任务里面
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2 end')
}
async1()
setTimeout(function () {
console.log("setTimeout100")
}, 100)
setTimeout(function () {
console.log("setTimeout")
}, 0)
new Promise(resolve => {
console.log('promise')
resolve()
}).then(function () {
console.log("promise1")
})
.then(function () {
console.log("promise2")
})
console.log('script end')
12345678910111213141516171819202122232425

最终打印顺序为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微任务宏任务执行顺序是有区别的。在每一个宏任务中又可以产生微任务,当微任务全部执行结束后执行下一个宏任务。这样的执行顺序可以表示为【宏任务 [微任务】 -> 【宏任务 [微任务】 -> 【宏任务 [微任务】... 宏任务。具体来说,当一个宏任务开始执行时,如果在宏任务的执行过程中产生了微任务,那么这些微任务会被添加到微任务队列中。当当前宏任务执行完成后,会立即执行微任务队列中的任务,直到微任务队列为空。然后才会执行下一个宏任务。这样的执行顺序保证了微任务优先于下一个宏任务的执行。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [干货:宏任务微任务执行顺序详解](https://blog.csdn.net/frontend_frank/article/details/130096892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [微任务宏任务哪个先执行?](https://blog.csdn.net/qq_59737146/article/details/128814404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值