前端面试中 Promise 的延伸问题
Promise 是前端面试中的核心知识点,除了基础用法外,面试官通常会深入考察以下延伸问题:
1. Promise 原理与事件循环
常见问题:
- 解释 Promise 的微任务机制与事件循环的关系
- Promise.then 和 setTimeout 的执行顺序差异及原因
- 如何手写实现一个符合 Promise/A+ 规范的 Promise
示例问题: "请解释为什么在同一个事件循环中,Promise.then 的回调总是比 setTimeout 的回调先执行?"
2. 高级错误处理
常见问题:
- Promise 链中错误的冒泡机制
- 未捕获的 Promise 错误会怎样处理
- 全局捕获 Promise 错误的方法(unhandledrejection 事件)
示例问题: "如果在 Promise 链的末尾没有 catch 错误,会发生什么?如何在应用中全局捕获这类未处理的 Promise 错误?"
3. 性能与优化
常见问题:
- Promise 内存泄漏的常见场景及预防
- 大量 Promise 并发处理的优化策略
- Promise 与 async/await 的性能差异
示例问题: "当需要处理 1000 个并发请求时,如何设计 Promise 的使用以避免内存问题?"
4. 异步控制流
常见问题:
- 实现 Promise 的串行执行(reduce 实现)
- 实现带并发限制的 Promise 调度器
- 实现 Promise 的重试机制(retry)
示例问题: "如何实现一个函数,可以限制同时最多有 N 个 Promise 在执行?"
5. Promise 组合与工具方法
常见问题:
- Promise.all、Promise.race、Promise.allSettled 的区别与使用场景
- 如何实现 Promise.any(ES2021 之前)
- 如何取消一个正在执行的 Promise
示例问题: "Promise.all 和 Promise.allSettled 的主要区别是什么?分别在什么场景下使用?"
6. Promise 与 generator/async-await
常见问题:
- 如何使用 Promise 实现 async/await 的 polyfill
- Promise 与 generator 函数的关系
- async 函数返回值的特殊之处
示例问题: "async 函数返回的是什么?为什么可以在 async 函数上直接调用 then 方法?"
7. 实际应用场景
常见问题:
- 在 React/Vue 中正确处理 Promise 的生命周期
- 使用 Promise 封装 Web API(如 fetch、FileReader)
- Promise 在状态管理(Redux/Vuex)中的应用
示例问题: "在 React 组件中,如何处理组件卸载后 Promise 返回导致的 setState 警告?"
8. 进阶编程题
常见问题:
- 实现 Promise 的超时控制
- 实现 Promise 的缓存(memoization)
- 实现 Promise 的防抖/节流
示例问题: "如何实现一个带有超时功能的 fetch 请求?当请求超过指定时间未返回时自动 reject"
9. 浏览器与 Node.js 差异
常见问题:
- 浏览器和 Node.js 中 Promise 的微任务队列处理差异
- process.nextTick 与 Promise 的执行顺序
- 不同 JavaScript 引擎对 Promise 的实现差异
示例问题: "在 Node.js 中,process.nextTick 和 Promise.then 的回调哪个先执行?为什么?"
10. 设计模式与最佳实践
常见问题:
- Promise 的单例模式实现
- 使用 Promise 实现发布/订阅模式
- Promise 在中间件模式中的应用(如 Koa 中间件)
示例问题: "如何使用 Promise 实现一个简单的中间件流程控制,类似 Koa 的洋葱模型?"
掌握这些延伸问题不仅能帮助你在面试中脱颖而出,更能加深对 JavaScript 异步编程的理解,在实际开发中写出更健壮的异步代码。