答案是实现一个符合Promise/A+规范的Promise库需正确处理状态机、异步回调和链式调用。首先定义pending、fulfilled、rejected三种不可逆状态,构造函数中通过resolve和reject函数改变状态并管理回调队列;then方法返回新Promise实例,支持链式调用,并根据当前状态异步执行对应回调;关键的resolvePromise函数处理返回值x为Promise或普通值的情况,防止循环引用并递归解析thenable对象,确保符合规范。

实现一个符合 Promise/A+ 规范的 JavaScript Promise 库,关键在于正确处理状态机、异步解析和 then 方法的链式调用。下面是一个简化但符合核心规范的实现思路。
1. 理解 Promise 的三种状态
Promise 有三种状态:
-
pending:初始状态,未完成也未拒绝
-
fulfilled:操作成功完成
-
rejected:操作失败
状态只能从 pending 变为 fulfilled 或 rejected,且一旦改变不可逆。
2. 实现基本结构与状态管理
定义构造函数和内部状态:
立即学习“Java免费学习笔记(深入)”;
function MyPromise(executor) {
this.state = 'pending';
this.value = undefined;
this.reason = undefined;
this.onFulfilledCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = (value) => {
if (this.state !== 'pending') return;
this.state = 'fulfilled';
this.value = value;
this.onFulfilledCallbacks.forEach(fn => fn());
};
const reject = (reason) => {
if (this.state !== 'pending') return;
this.state = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach(fn => fn());
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
3. 实现 then 方法
then 方法必须返回一个新的 Promise,以支持链式调用,并处理 onFulfilled 和 onRejected 回调。
MyPromise.prototype.then = function(onFulfilled, onRejected) {
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val;
onRejected = typeof onRejected === 'function' ? onRejected : err => { throw err; };
const promise2 = new MyPromise((resolve, reject) => {
if (this.state === 'fulfilled') {
queueMicrotask(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
});
}
if (this.state === 'rejected') {
queueMicrotask(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
});
}
if (this.state === 'pending') {
this.onFulfilledCallbacks.push(() => {
queueMicrotask(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
});
});
this.onRejectedCallbacks.push(() => {
queueMicrotask(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
});
});
}
});
return promise2;
};
4. 实现 resolvePromise 函数
这是 Promise/A+ 规范中最关键的部分,用于处理 x 是普通值还是 Promise 的情况。
function resolvePromise(promise2, x, resolve, reject) {
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected'));
}
if (x instanceof MyPromise) {
x.then(y => {
resolvePromise(promise2, y, resolve, reject);
}, reject);
} else if (x != null && (typeof x === 'object' || typeof x === 'function')) {
let called = false;
try {
const then = x.then;
if (typeof then === 'function') {
then.call(x, y => {
if (called) return;
called = true;
resolvePromise(promise2, y, resolve, reject);
}, r => {
if (called) return;
called = true;
reject(r);
});
} else {
resolve(x);
}
} catch (e) {
if (called) return;
called = true;
reject(e);
}
} else {
resolve(x);
}
}
基本上就这些。这个实现涵盖了 Promise/A+ 的核心逻辑:状态控制、回调队列、then 链式调用和 resolvePromise 的递归解析。要完全通过官方测试套件(promises-aplus-tests),还需补充更多边界情况,比如错误捕获时机、多次 resolve/reject 防止穿透等。
以上就是如何实现一个符合Promise/A+规范的JavaScript Promise库?的详细内容,更多请关注php中文网其它相关文章!