同步异步?宏任务微任务?

面试过程中遇到了该问题回答的不是太完整,看到大神的解析感觉很好理解故记录一下。

同步 && 异步

什么是异步,什么是同步,我不多说,我就通过小故事来讲讲吧。

  • 同步:你打电话去书店订书,老板说我查查,你不挂电话在等待,老板把查到的结果告诉你,这期间你不能做自己的事情
  • 异步:你打电话去书店订书,老板说我查查,回头告诉你,你把电话挂了,先去做自己的事情

JS执行机制

  • 1、遇到同步代码直接执行
  • 2、遇到异步代码先放一边,并且将他回调函数存起来,存的地方叫事件队列
  • 3、等所有同步代码都执行完,再从事件队列中把存起来的所有异步回调函数拿出来按顺序执行
console.log(1) // 同步
setTimeout(() => {
  console.log(2) // 异步
}, 2000);
console.log(3) // 同步
setTimeout(() => {
  console.log(4) // 异步
}, 0);
console.log(5) // 同步

输出 : 1 3 5 4 2

宏任务 && 微任务

前面说了,等所有同步代码都执行完,再从事件队列里依次执行所有异步回调函数

其实事件队列也是一个小团体,人家也有自己的规则,这就类似于学校管理着许多社团,人家自己社团内部也有人家自己的规矩。

话说回来,为什么事件队列里需要有自己的规则呢?要不你先想想为什么学校里的社团里要有自己的规则要分等级,是因为有的人能力强有的人能力弱,所以也就有了等级的高低。其实事件队列也一样,事件队列是用来存异步回调的,但是异步也分类型啊,异步任务分为宏任务微任务,并且微任务执行时机先于宏任务

那宏任务和微任务都分别有哪些呢?

宏任务

#浏览器Node
I/O
setTimeout
setInterval
setImmediate
requestAnimationFrame

微任务

#浏览器Node
Promise.prototype.then catch finally
process.nextTick
MutationObserver

即执行顺序:

同步 ==> 异步 ==> 微任务 ==>宏任务

console.log(1) // 同步
setTimeout(() => {
  console.log(2) // 异步:宏任务
});
console.log(3) // 同步
Promise.resolve().then(()=>{ // 异步:微任务
  console.log(4) 
})
console.log(5) // 同步

//输出 1 3 5 4 2
console.log(1) // 同步
setTimeout(() => {
  console.log(2) // 异步:宏任务 setTimeout1
  Promise.resolve().then(() => { // 异步:微任务 then1
    console.log(3)
  })
});
console.log(4) // 同步
new Promise((resolve,reject) => {
  console.log(5) // 同步
  resolve()
}).then(() => { // 异步:微任务 then2
  console.log(6)
  setTimeout(() => {
    console.log(7) // 异步:宏任务 setTimeout2
  })
})
console.log(8) // 同步

//注意:Promise的executor是同步的哦!!!
//输出 1 4 5 8 6 2 3 7

本文转载于:掘金​​​​​​​​​​​https://juejin.cn/post/7016298598883131423

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值