promise到底是在resolve时被推入微任务队列还是在then的时候呢?

promise到底是在resolve时被推入微任务队列还是在then的时候呢?

最开始是被题目中的问题所困惑,后来仔细想想,发现题目本身就是个伪命题,这种说法就不对,哈哈哈,难怪会很困惑,其实不存在在执行哪个的时候将promise推入到微任务中,promise是立即执行,创建就执行,resolve是用来表示promise的状态,只有当这种状态传递给then时,then中的函数才会被推入微任务。 —— 写于文章发布后,仔细想想觉得内容有所不妥,赶紧修改一番!!!希望读者不要被我之前的想法带坑里,要时刻记住我文章后面的结论。

今天在看async/await、promise等执行顺序时,一时被promise在什么时候被推出微任务队列搞得有点晕,是在执行resolve时还说执行then时?为了搞清楚这个问题,于是想了如下执行代码来验证:

console.log('script start')
Promise.resolve('resolve')
console.log('script end')
// script start
// script end 
console.log('script start')
Promise.resolve('resolve').then((res) => {console.log(res)})
console.log('script end')
// script start
// script end
// resolve

从上面运行结果可以看出resolve时没有输出结果,只有在执行then时才会有结果输出,且输出结果是在console.log(‘script end’)之后,证明了promise是在执行then时被推出微任务队列中。

后来又仔细一想,发现题目好像有问题,不应该这么提问,promise是立即执行,不存在将其推入微任务中的说法, 其实最准确的表述应该是:promise.then()中的函数是在resolve()被推出微任务的,还是在then的时候被推入微任务的?

此外,MDN中在介绍promise时序时也做了说明,如下图:

在这里插入图片描述
从上面可以看出只有resolve()之后,传递给then时,then中的函数才会被推到微任务中。

总结:

promise是立即执行的,它创建的时候就会执行,不存在将promise推入微任务中的说法;

resolve()是用来表示promise的状态为fullfilled,相当于只是定义了一个有状态的Promise,但是并没有调用它;

promise调用then的前提是promise的状态为fullfilled;

只有promise调用then的时候,then里面的函数才会被推入微任务中;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值