代码一
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')
},0)
async1();
new Promise(function(resolve){
console.log('promise1')
resolve();
}).then(function(){
console.log('promise2')
})
console.log('script end')
解析代码一:
放入任务队列的顺序是这样的:
1. 执行同步代码,输出script start
2.将setTimeout挂起,到回调的执行时间,将其回调函数放入宏任务队列最后
3.执行async1,输出async1 start
4.执行async2,输出async2
5.将async1 end 所在的输出语句放入微任务队列最后(因为await后面的语句相当于Promise的then)
6.输出promise1
7.将promise2所在的回调函数放入微任务队列最后
8.输出script end
9.输出async1 end
10.输出promise2
11.输出setTimeout
代码二:
let resolvePromise = new Promise(resolve => {
let resolvedPromise = Promise.resolve()
// let resolvedPromise = new Promise(resolve => {resolve()}) // 同上句
resolve(resolvedPromise)
// Promise.resolve().then(() => resolvedPromise.then(resolve)) // 上句的同意转化
})
resolvePromise.then(() => {
console.log('resolvePromise resolved')
})
let resolvedPromiseThen = Promise.resolve().then(res => {
console.log('promise1')
})
resolvedPromiseThen
.then(() => {
console.log('promise2')
})
.then(() => {
console.log('promise3')
})
代码二解析:
1.第一个then函数里面的() => resolvedPromise.then(resolve, reject)放入队列
2.将promise1所在的回调函数放入队列最后
3.因为resolvedPromise是一个已经resolved的Promise直接执行then函数,将then函数中的resolve()函数放入当前队列的最后
4.输出‘promise1’
5.将promise2所在的回调函数放入队列
6.执行resolve() 这时的resolvePromise终于变成了一个resolved状态的Promise对象了,将'resolvePromise resolved'放入当前任务列表
7.输出‘promise2’
8.将promise3所在的回调函数放到当前任务队列
9.输出‘resolvePromise resolved’
10.输出‘promise3’
参考文章:https://juejin.im/post/5c8a024d51882546be0a3082