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里面的函数才会被推入微任务中;