啊,昨天作业嘎嘎多,就没更新,下周要开始期中考了,可是我害没有解除隔离,呜呜呜呜呜
宏任务与微任务
前置概念
JS是单线程的,它的运行是基于事件循环机制 (event loop)
- 调用栈
- 栈
栈是一种数据结构,后进先出
- 调用栈中,放到是要执行的代码
- 任务队列
- 队列
- 队列是一种数据结构,先进先出
- 任务队列的是将要执行的代码
- 当调用栈中的代码执行完毕后,队列中的代码还会按照顺序依次进入到栈中执行(在栈中执行完一个再进去一个)
- 在JS当中任务队列有两种
- 宏任务队列 (大部分代码)
- 微任务队列 (Promise的回调函数(then、catch、finally)) VIP快速通道
- 为了更合理的处理异步任务,ES标准规定了一个内部的队列“PromiseJobs”,这个队列是专门用来放置由Promise产生的回调函数的(then、catch、finally),这个队列我们通常被称为“微任务队列(microtask queue)”
- 整个流程
1、执行调用栈中的代码
2、执行微任务队列中的所有任务
3、执行宏任务队列中的所有任务
queueMicrotask() 用来向微任务中添加一个任务
Promise的执行原理
- promise在执行,then就是相当于给Promise绑定了回调函数(事件)
当Promise的状态从pending变为fulfilled时
then的回调函数会被放入到任务队列中
开整
下列的哪个先出结果捏!
1、康康它
setTimeout(() => {
console.log(1)
},0)
console.log(2);
结果:2 1
分析一下下:
首先,setTimeout,开启了一个定时器,作用是间隔一段时间后,将函数放入到任务队列中
然后,console.log( ),写在了全局作用域里,写在全局作用域里的代码,一上来就直接是在调用栈里的
所以!先2,再1
2、再来一个嗷!
setTimeout(()=>{
console.log(1)
})
Promise.resolve().then(() => {
console.log(2)
})
结果:2 1
再分析一下下:
因为setTimeout和then虽然都将函数放入到队列中,但是却不是同一个队列,前文我们已经提到了, Promise的回调函数(then、catch、finally)走的是 VIP快速通道
setTimeout 进入宏任务队列,then进入到的是微任务队列
所以!先2,再1
3、再再来一个嗷~ 桀桀桀!
console.log(1);
setTimeout(() => console.log(2));
Promise.resolve().then(() => console.log(3));
Promise.resolve().then(() => setTimeout(() => console.log(4)));
Promise.resolve().then(() => console.log(5));
setTimeout(() => console.log(6));
console.log(7);
结果:1 7 3 5 2 6 4
桀桀桀!除了咱的任务栈里,宏任务微任务之外,代码都是自上而下的捏!
今天就只看了看这个,啊!周中果然没有特别多的空闲时间,希望这周末可以把node的基础学完