setTimeout&async&Promise执行顺序

  目录

setTimeout&async&Promise执行顺序简要分析

setTimeout&async&Promise执行顺序

看到标题,觉得这种需求在实际项目中基本遇不到,是的,我从没有遇到过,而且,要用就用一种,既然用了async,还用啥Promise。不过,网上有一道面试题,据说是今日头条的面试题,考的就是这方面的知识,先贴出代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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')

答案一会再说。
先来分析一下,setTimeout,async,Promise执行的有先顺序。其实,要想研究明白这个问题,需要了解异步执行的宏任务,微任务知识,而且,在浏览器和nodejs环境下还不一样,这里我不对这些知识作深入分析,因为我看了些相关知识,看的晕头转向,所以,我只简单的记一下在浏览器环境下的优先顺序。
异步发生的节点是:
1.setTimeout的回调函数。
2.Promise实例的then方法中的回调函数。
3.async函数中await 后面紧跟着的函数(如async2),这个地方比较有意思,进入async2的时候是同步的,async2里边如果都是同步函数,那就继续执行,等执行完毕,返回先关东西后,”await async2()”这句话下边的语句不会马上执行,有点像Promise实例的then方法中的回调一样,需要排队等待。
所以,优先顺序是Promise的then方法回调第一,async await 之后的语句排第二,setTimeout的回调排第三。
记住了吗?我没有考虑理论知识,只是简单地死记硬背而已。
最后,把上边代码的结果写出来,看看与你想的是否一样。

1
2
3
4
5
6
7
8
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout