js执行顺序问题

题目描述

原题目来源在这: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微任务之后?

阅读 1.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏