题目描述
原题目来源在这:https://www.jianshu.com/p/62c...
题目来源及自己的思路
第一题,明白了,但变种了下,就发现有知识盲区,变动地方如下:
async function async2() {
console.log('async2');
}
变成
async function async2() {
console.log('async2');
await console.log("async2.1");
console.log("async2.2")
}
完整改变后的代码如下
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2');
await console.log("async2.1");
console.log("async2.2")
}
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');
你期待的结果是什么?实际看到的错误信息又是什么?
不懂在async2.2,async1 end,promise2的输出顺序
我思路是当执行完async2方法的await行,将输出“async2.2”的行放入微任务队列,跳出async2方法,此时到async1方法,将async1方法的await后再放入微任务队列,然后跳出async1方法,执行Promise,输出promise1,将then后的放入微任务队列
那么微任务队列不是应该:
...
async2.2
async1 end
promise2
..
但实际输出是
async2.2
promise2
async1 end
难不成是将输出“async2.2”的行放入微任务队列后,会“完全跳出async方法”,即一层一层往上跳出,直到跳无可跳?然后输出promise1,将then后的放入微任务队列。然后开始清空微任务队列,先输出
async2.2
此时相当于async1的Prmoise定义方法(执行async2)执行完毕,将其then方法放入微任务队列(也就是将输出async1 end放入微任务队列),此时输出async1 end方法堆栈在输出promise2微任务之后?