宏任务一般是:包括整体代码script
,setTimeout
,setInterval
、I/O
、UI render
。
微任务主要是:Promise
、Object.observe
、MutationObserver
process.nextTick
nextTick
优先级比 Promise
等 microTask
高,setTimeout
和setInterval
优先级比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')