嵌套Promise执行顺序疑问:为何输出与预期不符?
嵌套Promise执行顺序疑问解答
问题代码
new Promise((resolve) => { new Promise((res) => { console.log("c"); resolve(3); res(2); }).then((response) => console.log(response)) }).then((res) => console.log(res));
实际运行输出
c 2 3
用户预期输出
c 3 2
用户困惑:认为外层Promise会先被resolve,对应的then回调应该先执行,所以预期输出顺序为c→3→2,但实际顺序不符,需要解释执行逻辑。
执行顺序解析
首先执行所有同步代码:
- 进入外层Promise的执行器函数,立刻创建内层Promise并执行其执行器:
- 同步打印
c,这是第一个输出; - 调用外层Promise的
resolve(3):将外层Promise标记为已兑现状态,其then回调被加入微任务队列等待执行; - 调用内层Promise的
res(2):将内层Promise标记为已兑现状态,其then回调同样被加入微任务队列——由于内层Promise的then是先绑定的,所以它的回调在微任务队列中排在外层回调的前面。
- 同步打印
- 进入外层Promise的执行器函数,立刻创建内层Promise并执行其执行器:
同步代码执行完毕后,JS引擎开始按顺序处理微任务队列:
- 先执行队列中靠前的内层Promise
then回调,打印2; - 再执行外层Promise的
then回调,打印3。
- 先执行队列中靠前的内层Promise
核心要点:
- Promise的执行器函数是同步执行的,
resolve/res只是改变Promise状态,不会立刻触发then回调; then回调会被放入微任务队列,队列遵循先进先出原则,先绑定的回调先执行。
内容的提问来源于stack exchange,提问作者Sheraz
相关产品推荐
相关产品推荐

