96SEO 2026-07-23 08:32 0
话说回来,
Promise 源码看了一百遍。不如自己写一遍,
相信很多前端同学都有过这样的经历:面试问手写 Promise,网上搜一搜 "Promise A+ 规范实现",接下来对着代码 Copy 一遍。写完还是云里雾里 —— 那些 .nPromise.resolvePromise.all 到底是怎么串起来的?

这篇文章不打算贴完整代码。而是换个方式:用一个最小、最简、最裸的 MiniPromise,带你从零理解 Promise 的设计思路。
在 Promise 出现之前,我们用回调函数来处理异步:
fetchData {
processResult {
saveData {
// ... 回调地狱
});}),});
这叫 回调地狱问题不仅仅是嵌套难读,错误处理分散、状态不可控。
Promise 的主要思路就两点:
.n 返回一个新的 Promise,实现"异步组合"理解这两点,你就能自己动手写一个简化版 Promise。其实,
class MiniPromise {
constructor {
this.state = 'pending';不过,this.value = undefined;this.onFulfilledCallbacks =;this.onRejectedCallbacks =;const resolve = => this._resolve;const reject = => this._reject;try {
executor;} catch {
reject;}
}}
就这?一个类,三个属性,两个数组?
对,就是这么裸。按理说,Promise 本质就是一个状态容器所有的魔法都在 _resolve 方法里。
_resolve {
// 只能从 pending 变一次
if return;// 如果 value 是 Promise。需要"展开"
if {
return value.n,this._reject.bind);}
this.state = 'fulfilled';this.value = value;// 异步执行回调 —— 这就是 n 可以链式调用的关键
queueMicrotask => {
this.onFulfilledCallbacks.forEach);}),}
等等,这里有个关键点:为什么要用 queueMicrotask?话说回来,
因为 Promise 的设计原则是:n 的回调必须异步执行。这保证了执行顺序的可预测性,也是 Promise/A+ 规范的要求。
n {
// 返回一个新的 Promise。这就是链式调用的秘密
return new MiniPromise => {
const handleCallback = => {
try {
// 如果没有传回调,直接透传 value
const result = callback?
callback : value;resolve,// 关键:resolve 的是回调的返回值
} catch {
reject;}
},if {
// 异步执行,保持一致性
queueMicrotask => handleCallback);} else if {
queueMicrotask => handleCallback);} else {
// pending 状态,先把回调存起来
this.onFulfilledCallbacks.push => handleCallback);this.onRejectedCallbacks.push => handleCallback);}
}),}
看到没?n 返回的是全新的 Promise,而不是直接返回结果。这个新 Promise 的 resolve 取决于回调函数的返回值——这就是链式调用的本质。
static resolve {
if return value;return new MiniPromise);}
static reject {
return new MiniPromise => reject);}
简单到不用解释。
static all {
return new MiniPromise => {
const results =;let completed =;if return resolve;promises.forEach => {
MiniPromise.resolve.n(val => {
results = val;completed++,if resolve;},reject),});}),说起来,}
至于主要就一个。遍历 +计数 +全部成功才 resolve.
从魔法来看。: 就是一个有状态管理的异步容器,外加一套回调收集 + 异步调度机制。
链式调用的本质:: 每个 .n` 返回一个新 Promise,上一个 n 的返回值成为下一个 n 的输入。其实,
`queueMicrotask` 的作用:: 确保 n 的回调总是异步执行。这是 Promise 行为一致性的根基。老实说,
`Promise.resolve` 的“递归展开”:: 如果 resolve 的是一个 Promise。需要等它完成后再 fulfill 当前 Promise,这是最难理解的部分。
手写一遍之后再看
S源码不是魔法,原理才是。
C完整代码我已经整理到 GitHub,有兴趣的同学可以跑跑测试:Ppromise.all。Ppromise.race,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback