前端/移动开发面试题更新 2026-08-05

请用 JavaScript 语言手写实现 Promise 对象,要求提供完整可运行的代码实现。

前端/移动开发编码实现技术原理JavaScript

考察说明

考查对 Promise 规范的理解以及用 JavaScript 实现异步流程控制的能力。

回答思路

  1. 【回答框架 1】Promise 是一个代表异步操作最终完成或失败的对象,核心状态包括 pending、fulfilled、rejected,状态一旦改变不可再变。实现时先定义构造函数,接收 executor 函数,并立即执行 executor(resolve, reject)。resolve 和 reject 分别将状态从 pending 变为 fulfilled 或 rejected,并保存结果或原因。
  2. 【回答框架 2】需要实现 then 方法,它接收 onFulfilled 和 onRejected 回调。then 返回一个新的 Promise,实现链式调用。在 then 中根据当前状态处理:若状态已定,则异步调用对应回调;若仍为 pending,将回调存入队列。回调返回值 x 需要根据 resolvingPromise 的处理逻辑决定新 Promise 的状态,即若 x 是 Promise 则等待其状态,否则直接 resolve。
  3. 【回答框架 3】还需实现 catch 方法,它是 then(null, onRejected) 的语法糖。另外,可选实现 Promise.resolve、Promise.reject、Promise.all、Promise.race 等静态方法,但核心是 then 的链式调用和状态管理。性能上,回调应使用微任务机制(如 queueMicrotask 或 MutationObserver)模拟异步执行,避免同步调用导致调用顺序不符。
  4. 【回答框架 4】边界情况包括:循环引用(如 promise 的 then 回调返回自身),需要抛类型错误;多次调用 resolve/reject 只有第一次生效;executor 抛出异常时自动触发 reject。
  5. 【关键点 1】Promise 三种状态(pending、fulfilled、rejected),状态一旦改变不可逆。
  6. 【关键点 2】then 方法返回新 Promise,实现链式调用,并用 resolvingPromise 处理回调返回值。
  7. 【关键点 3】异步执行回调,使用 queueMicrotask 或类似机制模拟微任务。
  8. 【关键点 4】异常处理:executor 抛错和回调抛错都应导致 reject。
  9. 【易错点 1】错误地同步调用 resolve 或 reject,破坏 then 回调的异步性。
  10. 【易错点 2】未处理循环引用,导致递归死循环。