setTimeout(function(){
console.log('1')
});
new Promise(function(resolve){
console.log('2');
resolve();
}).then(function(){
console.log('3')
});
console.log('4');
new Promise(function(resolve){
console.log('5');
resolve();
}).then(function(){
console.log('6')
});
setTimeout(function(){
console.log('7')
});
function bar(){
console.log('8')
foo()
}
function foo(){
console.log('9')
}
console.log('10')
bar()
// 会先执行 主线程(同步任务)上面的任务 然后再执行(异步任务)上面的微任务 再执行(异步任务)宏任务
// 1 7 是(异步任务)宏任务 <3>
// 2 4 5 10 8 9 是主线程(同步任务) <1>
// 3 6 是微任务 (同步任务里面的微任务) <2>
// 所有最终结果是
// 2,4,5,10,8,9,3,6,1,7
微任务
process.nextTick
MutationObserver
Promise.then catch finally
async await 中await执行完后后面的代码也是微任务
宏任务
I/O
setTimeout
setInterval
setImmediate
requestAnimationFrame
补充:
事件循环分为 同步任务 和 异步任务
会先执行同步任务 ,再执行异步任务
异步任务分为 宏任务 和 微任务
优先执行微任务再执行宏任务
会先执行 主线程(同步任务)上面的任务 然后再执行(异步任务)上面的微任务 再执行(异步任务)宏任务
async function async1() {
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2')
}
console.log('script start')
setTimeout(function () {
console.log('settimeout')
})
async1()
new Promise(function (resolve) {
console.log('promise1')
resolve()
}).then(function () {
console.log('promise2')
})
console.log('script end')
// async await 中await执行完后后面的代码也是微任务
// 打印结果为
// script start
// async1 start
// async2
// promise1
// script end
// async1 end
// promise2
// settimeout