结合收藏文章 async await 8张图详解执行顺序总结
// 1
function axiosGetList() {
return new Promise((resolve, reject) => {
console.log('axios')
resolve(true)
})
}
// 2
async function getList() {
const a = await axiosGetList()
if (a) {
console.log('请求成功')
}
}
// 执行
c()
// 3
function c() {
console.log('c start')
async function dd() {
const a = await getList()
console.log('a:',a)
}
dd()
console.log('c end')
}
// 4
new Promise((r, j) => {
console.log('promise1')
r() // 如果没有这行,promise2 不会执行
}).then(() => {
console.log('promise2')
})
// 5
setTimeout(() => {
console.log('settimeout')
}, 0)
// 6
console.log('window')
输出结果(谷歌浏览器):
1、c start
2、axios
3、c end
4、promise1
5、window
6、请求成功
7、promise2
8、a: undefined
9、settimeout
第一步:
进入 c() 执行 console.log('c start')
第二步:
进入 dd() 执行 await getList()
进入 getList() 执行 await axiosGetList()
进入 axiosGetList() 执行 console.log('axios')
第三步:
执行完所有的 await 后
会跳出到第二步 dd() 的地方(也就是第一次执行 await 的函数
先是寻找与它(dd())同级的同步并执行)
console.log('c end'),同级的同步执行完后
会跳到外层去执行同步
【这里提醒一下,遇到 await 会先截断后面的程序】
第四步:
执行最外层的 new Promise() 的
console.log('promise1'),此时的 then 函数并不会执行
这里不作描述了
第五步:
执行 console.log('window')
为什么不执行 setTimeout 呢,setTimeout 总是会放在最后面去执行
这里也不作描述了
【结合收藏文章 async await 8张图详解执行顺序总结】第六步:
执行完外层的同步后,又会回到调用 await 的地方
回到哪一步呢,就是回到最后有执行 await 的地方
去干什么呢,去执行 then 方法
看到 getList() 方法里,我们是通过赋值形式去获取的
当然,你也可以写成 then 形式去,换成 then 就是
await axiosGetList().then(() => { console.log('请求成功') })
第七步:
这时候,await 里面的 then 都执行完了
它又会先跳到外层去寻找异步函数并且去执行它
我们最外层还有个 then 函数没有执行,就是
console.log('promise2')
第八步:
好了,内部与外部的 then 函数都执行完了
可以安心的走 await 后面的程序了,又回到第一次调用
await 的地方执行它后面的 console.log('a', a)
这里的 a 因为没有接收到返回值,所以为 undefined
第九步:
执行 setTimeout 的 console.log('settimeout')
总结:文章仅是个人总结出的结论,并不保证100%正确,学而时习之,温故而知新
推荐阅读
- 宽容谁
- 一个人的旅行,三亚
- 第6.2章(设置属性)
- 布丽吉特,人生绝对的赢家
- 家乡的那条小河
- 讲述,美丽聪明的海欧!
- PMSJ寻平面设计师之现代(Hyundai)
- 夜游宫|夜游宫 心语
- 增长黑客的海盗法则
- 画画吗()