【前端每天一题】🔥 第 14 题:Promise.then 链式调用执行顺序

这道题是大厂面试常考题,核心考察对事件循环和微任务队列的理解。


✅ 第 14 题:Promise.then 链式调用执行顺序


📘 一、核心概念

  • Promise.then / catch / finally 回调都是微任务(microtask)
  • 微任务队列:当前宏任务执行完后立即执行所有微任务
  • 同步代码先执行 → 微任务 → 宏任务

📘 二、经典题目

javascript 复制代码
console.log('script start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
  console.log('promise1');
}).then(() => {
  console.log('promise2');
});

console.log('script end');

📘 三、详细分析(步步解析)

  1. 同步执行
arduino 复制代码
console.log('script start') // 输出 1
console.log('script end')   // 输出 2
  1. 微任务队列(Promise.then)
  • 第一个 then 回调 → 输出 'promise1'
  • 第二个 then 回调 → 输出 'promise2'
  1. 宏任务队列(setTimeout)
  • 输出 'setTimeout'

📘 四、最终输出顺序

arduino 复制代码
script start
script end
promise1
promise2
setTimeout

✅ 面试官非常喜欢问这个输出顺序。


📘 五、速记卡(10 秒复盘版)

javascript 复制代码
🎯 同步代码 > 微任务(Promise.then) > 宏任务(setTimeout/setInterval/IO)

🎯 Promise.then 内再 then → 链式微任务,依次执行

🎯 核心点:
- Promise.then 回调总是微任务
- 微任务会在当前宏任务结束后立即执行
- 微任务内部再生成微任务,会追加到队列末尾

📘 六、拓展题(加分)

javascript 复制代码
Promise.resolve()
  .then(() => {
    console.log('1');
    setTimeout(() => console.log('2'), 0);
  })
  .then(() => console.log('3'));

输出顺序:

复制代码
1
3
2

解释:

  • '1' → 微任务队列第一个
  • setTimeout → 宏任务
  • 第二个 then → 微任务队列末尾,紧跟 '1' 执行
  • 宏任务最后执行 '2'

相关推荐
不懂数据的小白几秒前
面试题一:【一】指标体系的搭建(基石)
面试
lichenyang45312 分钟前
鸿蒙 Stage 模型到底是什么?一篇讲清 Ability、EntryAbility 和入口文件为什么这么设计
前端
sbjdhjd27 分钟前
面试题完结 | 投票题 + 到岗时间 + 压力缓解
经验分享·笔记·面试·职场和发展·开源·求职招聘·印象笔记
ihuyigui28 分钟前
国际商超零售短信接口
大数据·前端·后端·架构·零售
Yan-英杰28 分钟前
从零玩转搜索引擎 API: 多引擎整合实战
服务器·前端·microsoft
Spider_Man33 分钟前
Claude Code Hooks:给 AI 助手装上"安全带"
前端·ai编程·claude
贺国亚34 分钟前
Durable-Workflow-Temporal与Agent控制面分工
面试
lichenyang45337 分钟前
HarmonyOS 6.0 ArkUI 循环渲染:ForEach、LazyForEach 和 Repeat 到底怎么选?
前端
Captaincc1 小时前
置身钉内:一个 AI 办公产品的理想、失焦与组织困境
前端·程序员
零陵上将军_xdr1 小时前
后端转全栈学习-Day6-JavaScript 基础-4
前端·javascript·学习