前端面试题

手写Promise(通过Promise/A+基础测试)

手写一个通过Promise/A+基础测试的Promise。

为什么面试官会问这道题

头部前端代码轮必考。写得出说明你对异步状态机理解到规范级。

如何回答

  1. 1

    三态:pending/fulfilled/rejected,单向转移。

  2. 2

    构造函数:接受executor (resolve, reject)=>{...},捕获回调。

  3. 3

    .then(onFulfilled, onRejected):必须返回新Promise;链式靠执行handler然后用返回值resolve新Promise。

  4. 4

    异步保证:handler始终异步执行(queueMicrotask或setTimeout),即使Promise已经resolve。

  5. 5

    then里返回thenable:递归resolve(Promise/A+的2.3.3规则)。

参考回答示例

三态pending/fulfilled/rejected单向转移。构造函数里收集pending时入队的回调,resolve/reject时依次触发。难点在.then:必须返回新Promise、handler必须异步跑(queueMicrotask)、必须采纳handler返回值的状态——包括返回的是另一个thenable(2.3.3递归)。最后这条是大多数手写实现通不过兼容性测试的地方。我背了约40行的版本:class MyPromise带state/value/handlers[],resolve/reject遍历handlers;then()`new MyPromise`,在executor里queueMicrotask跑当前handler,把返回值resolve给新Promise。达不到生产级但核心测试能过。

实用技巧

  • 用queueMicrotask不用setTimeout——匹配规范的微任务语义。

  • 别忘了finally():不管状态都跑、不观察值、透传。

  • 即答侠有40行模板放手边——白板时不会卡壳。

常见问题

为什么.then要返回新Promise?

为了链式。链上每一环必须独立可观察、可组合。返回同一个Promise会破坏fan-out。

2.3.3是什么?

Promise/A+里采纳thenable的规则——handler返回带.then的对象时新Promise要递归沿着它resolve。最难写对的一段。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠