同步,setTimeout,Promise,async执行顺序

对于执行顺序不是特别的理解,反正又不影响敲代码,但是每次面试的面试题会有执行顺序的输出,之前不是特别的理解,最近又借鉴了大佬的文章,通透了许多,回想之前的有些代码bug,还是理解对于写出优质的代码有优势。
先看分析总结,再看实例:

大佬的文章开头是先让看一段代码输出的结果,一番操作猛如虎,一运行,ow,no
setTimeout的优先级没有async和promise级别高(其实async和promise是一样的,因为调用async方法时就是返回一个promise对象)
而后async和promise的.then就看谁先进入到的任务队列里面,任务队列里面有先进先出的概念。

async function async1() {
   console.log('async1 start')
   await async2()
   console.log('async1 end')
}
async function async2() {
   console.log('async2')
}
console.log('script start')
setTimeout(() => {
	console.log('setTimeout')
},0)
async1()
new Promise((resolve) => {
	console.log('promise1')
	resolve()
}).then(() => {
	console.log('promise2')
})
console.log('script end')

这是浏览器运行的效果:
在这里插入图片描述
在这里插入图片描述

红线框起来的地方这个是两个函数,但是并没有调用,所以不执行,往下走
在这里插入图片描述
这是同步的内容,所以会直接执行输出:script start,继续往下执行
在这里插入图片描述
到了setTimeOut,由于setTimeOut执行顺序是最低的,所以不输出,继续往下走
在这里插入图片描述
调用了async1函数,会走入到这个函数里,当调用async函数的时候会返回一个Promise对象。Promise对象是立即执行的,所以会输出async1 start,继续执行
在这里插入图片描述
到了 调用await async2(),进入函数,立即输出async2,async里遇到await它会使async函数暂停执行,执行完async里的await内容后将后续的内容扔入到浏览器的任务队列里面去。所以继续往下执行,就到了async1()的后面 到了Promise:
在这里插入图片描述
Promise是立即执行的,所以它会立即输出promise1,后是执行了resolve。执行成功,执行成功的话会走入promise的.then方法里,可是它是异步的回调函数,所以会被丢入到任务队列里。
在这里插入图片描述
继续执行输出script end
(现在任务队列里面有一个setTimeout和一个async1的后续内容在加上promise的.then内容)
现在就看谁的权重优先级高先输出,
由于setTimeout的优先级没有async和promise级别高(其实async和promise是一样的,因为调用async方法时就是返回一个promise对象)

而后async和promise的.then就看谁先进入到的任务队列里面,任务队列里面有先进先出的概念。所以它们三个的输出顺序是:
6.输出:async1 end
7.输出:promise2
8.输出:setTimeout
看了大佬的分析,理解了执行顺序,很开心,谢谢大佬的分享。
转载自:https://wudi98.blog.csdn.net/article/details/91360230

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值