面试官让我手写一个Promise
Sarah Wong | 2026-07-30T14:13:00 | JavaScript, Frontend
手写一个符合Promises/A+规范的Promise实现,搞懂微任务队列和链式调用的本质
# 面试官让我手写一个Promise 上周面试被要求手写Promise,当场写了个简化版,面试官看完说"可以"。分享给大家。 ## 核心实现 ```javascript function MyPromise(executor) { var self = this; self.status = 'pending'; self.value = undefined; self.callbacks = []; // 存储then的回调 function resolve(value) { if (self.status !== 'pending') return; self.status = 'fulfilled'; self.value = value; // 异步执行所有回调(模拟微任务) setTimeout(function() { self.callbacks.forEach(function(cb) { cb.onFulfilled(value); }); }, 0); } function reject(reason) { if (self.status !== 'pending') return; self.status = 'rejected'; self.value = reason; setTimeout(function() { self.callbacks.forEach(function(cb) { cb.onRejected(reason); }); }, 0); } try { executor(resolve, reject); } catch (e) { reject(e); } } // then方法:返回新Promise实现链式调用 MyPromise.prototype.then = function(onFulfilled, onRejected) { var self = this; return new MyPromise(function(resolve, reject) { self.callbacks.push({ onFulfilled: function(value) { try { var result = onFulfilled(value); resolve(result); } catch (e) { reject(e); } }, onRejected: function(reason) { try { var result = onRejected(reason); resolve(result); } catch (e) { reject(e); } } }); }); }; ``` 关键点:then返回新Promise是链式调用的核心,回调用setTimeout模拟微任务(真正规范要用queueMicrotask)。