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

请用 JavaScript 手写实现一个与原生 Promise 行为一致的 then 方法,并给出完整代码。

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

考察说明

考查对 Promise 核心机制(状态机、微任务队列、链式调用、值穿透)的理解及手写实现能力。

回答思路

  1. 【回答框架 1】实现一个 MyPromise 类,维护三种状态 pending、fulfilled、rejected 和 value 或 reason。then 方法接收 onFulfilled 和 onRejected 两个回调,需在构造函数中保存这两个回调到数组,在状态变更后统一调用。
  2. 【回答框架 2】then 返回一个新的 Promise,实现链式调用。当回调返回值是普通值时,直接 resolve;若返回一个 Promise 或 thenable 对象,则递归调用其 then 方法实现 promise 的 assimilate 机制。
  3. 【回答框架 3】使用微任务触发回调,可以使用 queueMicrotask 或 Promise.resolve().then 包装,保证异步执行。
  4. 【回答框架 4】需处理回调缺失时的值穿透:当 onFulfilled 不是函数时,用默认函数 v => v 传递 value;当 onRejected 不是函数时,用默认函数 r => { throw r } 传递 reason。
  5. 【回答框架 5】状态只能单向流转,且一旦改变不可逆。代码还需处理 then 多次调用,每个 then 都注册独立的回调数组。
  6. 【关键点 1】then 必须返回新的 Promise 以支持链式调用。
  7. 【关键点 2】回调应在微任务中异步执行。
  8. 【关键点 3】需处理返回值是 thenable 时递归调用其 then 方法。
  9. 【关键点 4】状态切换只能从 pending 到 fulfilled 或 rejected,不可逆。
  10. 【关键点 5】回调缺失时实现值穿透。
  11. 【易错点 1】若让 then 返回 this 会导致状态混乱,无法链式处理异步结果。
  12. 【易错点 2】忘记处理回调抛错时的捕获,会导致 promise 状态无法正确变为 rejected。
  13. 【易错点 3】同步执行回调会破坏 Promise 异步语义,必须使用微任务。