js执行时序 宏任务和微任务

宏任务一般是:包括整体代码scriptsetTimeoutsetIntervalI/OUI render
微任务主要是:PromiseObject.observeMutationObserver process.nextTick

 

nextTick 优先级比 PromisemicroTask 高,setTimeoutsetInterval优先级比setImmediate高。

执行栈在执行完同步任务后,查看执行栈是否为空,如果执行栈为空,就会去检查微任务(microTask)队列是否为空,如果为空的话,就执行Task(宏任务),否则就一次性执行完所有微任务。
每次单个宏任务执行完毕后,检查微任务(microTask)队列是否为空,如果不为空的话,会按照先入先出的规则全部执行完微任务(microTask)后,设置微任务(microTask)队列为null,然后再执行宏任务,如此循环。

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');

console.log('script start');

async function async1() {

  await async2();

  console.log('async1 end')

}

async function async2() { console.log('async2 end') };

async1();

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');

console.log('start');

setTimeout(() => {

  console.log('timer1');

  Promise.resolve().then(function () { console.log('promise1') })

}, 0);

setTimeout(() => {

  console.log('timer2');

  Promise.resolve().then(function () { console.log('promise2') })

}, 0);

Promise.resolve().then(function () { console.log('promise3') });

console.log('end')

执行结果:

console.log('C')
var p = new Promise((resolve, reject) => {
    console.log('A')
    resolve('B')

    Promise.resolve('D').then(res => {
        console.log(res)
    })
})
p.then(res => {
    console.log(res)
})
setTimeout(() => {
    console.log('I')
    Promise.resolve('G').then(res => {
        console.log(res)
    })
})
setTimeout(() => {
    console.log('F')
    Promise.resolve('H').then(res => {
        console.log(res)
    })
})
console.log('E')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值