const PENDING = "PENDING"; const FULFILLED = "FULFILLED"; const REJECTED = "REJECTED"; function resolve(value) { return value; } function reject(err) { throw err; } function resolvePromise(promise2, x, resolve, reject) { if (promise2 === x) { return reject( new TypeError("Chaining cycle detected for promise #<Promise>") ); } let called; if ((typeof x === "object" && x != null) || typeof x === "function") { try { let 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); } } class Promise { constructor(executor) { this.status = PENDING; this.value = undefined; this.reason = undefined; this.resolveCallbacks = []; this.rejectCallbacks = []; let resolve = (value) => { if (this.status === PENDING) { this.status = FULFILLED; this.value = value; this.resolveCallbacks.forEach((fn) => fn()); } }; let reject = (reason) => { if (this.status === PENDING) { this.status = REJECTED; this.reason = reason; this.rejectCallbacks.forEach((fn) => fn()); } }; try { executor(resolve, reject); } catch (error) { reject(error); } } then(onFulfilled, onRejected) { onFulfilled = typeof onFulfilled === "function" ? onFulfilled : resolve; onRejected = typeof onRejected === "function" ? onRejected : reject; let promise2 = new Promise((resolve, reject) => { if (this.status === FULFILLED) { setTimeout(() => { try { let x = onFulfilled(this.value); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); } if (this.status === REJECTED) { setTimeout(() => { try { let x = onRejected(this.reason); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); } if (this.status === PENDING) { this.resolveCallbacks.push(() => { setTimeout(() => { try { let x = onFulfilled(this.value); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }); this.rejectCallbacks.push(() => { setTimeout(() => { try { let x = onRejected(this.reason); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }); } }); return promise2; } }
更标准的实现