promise then 的回调函数是在遇到 resolve 语句的时候就被加入微任务队列,还是在遇到 then 语句的时候被加入到微任务队列?
在网上查了一些资料,发现有不同的说法:
- 比如在《深入理解ES6》中文版 244 页里是这么说的:“调用 resolve( ) 后会触发一个异步操作, 传入 then( ) 和 catch( ) 方法的函数会被添加到任务队列中并异步执行”,所以 then 方法的回调应该是在调用 resolve 后就被加入到队列中的?
- 对应的英文版原文是这么说的:“Calling resolve() triggers an asynchronous operation. Functions passed to then() and catch() are executed asynchronously, because these are also added to the job queue”
- 这个是知乎的回答:链接
- 这个是 StackOverflow 类似问题的回答:链接 ,答主在分析 event loop 的时候有这么一句:“The first then hooks up the first fulfillment handler, queuing a PromiseJobs job because the promise is already fulfilled”
1、2 都认为 then 的回调函数是在遇到 resolve 语句的时候就被加入微任务队列,3、4 都认为是在遇到 then 语句的时候被加入到微任务队列的。到底哪一种说法是正确的呢?
都没问题。
关键在于,
then
是在resolve
之前被调用的,还是resolve
之后呢?then
在resolve
之前,then
不会加微任务,而是缓存起来,resolve
看到缓存里又then
的回调,于是加微任务。resolve
在then
之前,resolve
的时候还没有任何回调要执行,自然不会加微任务。then
的时候发现已经 fullfilled ,于是直接加微任务。也就是说,他们都有可能加,也都有可能不加,就看调用时的 promise 的状态了。
你的引用有些只说明了其一,但是说明里条件写得还是很清楚的,比如 4 里 "because the promise is already fulfilled"