跳到主要内容

实现简单的 Promise

Promises/A+

安装 nodemon

为了便于在开发过程中自动重启 Node.js 应用程序,建议安装 nodemon

npm install -g nodemon

实现简单的 Promise

下面是一个简化版的 Promise 实现,旨在帮助理解 Promise 的基本工作原理。

const PENDING = 'PENDING';
const FULFILLED = 'FULFILLED';
const REJECTED = 'REJECTED';

class MyPromise {
constructor(executor) {
this.status = PENDING;
this.value = undefined;
this.reason = undefined;

const resolve = (value) => {
if (this.status === PENDING) {
this.status = FULFILLED;
this.value = value;
}
};

const reject = (reason) => {
if (this.status === PENDING) {
this.status = REJECTED;
this.reason = reason;
}
};

try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}

then(onFulfilled, onRejected) {
if (this.status === FULFILLED) {
onFulfilled(this.value);
}
if (this.status === REJECTED) {
onRejected(this.reason);
}
}
}

const promise = new MyPromise((resolve, reject) => {
throw new Error('Exception: Error');
// resolve('成功');
});

promise.then(
(value) => {
console.log(value);
},
(reason) => {
console.log(reason);
}
);

代码解析

MyPromise 类模拟了原生 Promise 的基本行为,包括状态管理和 then 方法的实现。

  • 状态管理: MyPromise 有三个状态,PENDING(待定)、FULFILLED(已兑现)和 REJECTED(已拒绝)。状态一旦从 PENDING 变为 FULFILLEDREJECTED,便不可逆转。

  • 构造函数: 接受一个执行器函数 executor,该函数在实例化时立即执行,并传入 resolvereject 两个函数,用于改变 Promise 的状态。

  • then 方法: 根据当前 Promise 的状态,调用相应的回调函数 onFulfilledonRejected

使用示例

在上面的示例中,MyPromise 被实例化时执行器函数抛出了一个错误,这将触发 reject 方法,最终在 then 方法中调用 onRejected 回调,输出错误信息。

const promise = new MyPromise((resolve, reject) => {
throw new Error('Exception: Error');
// resolve('成功');
});

promise.then(
(value) => {
console.log(value);
},
(reason) => {
console.log(reason);
}
);
// 输出: Error: Exception: Error

注意事项

  • 同步执行: 在这个简化的实现中,executor 函数和回调函数都是同步执行的。原生 Promise 支持异步操作,这需要更复杂的处理,如使用微任务队列。

  • 多次调用 then: 当前实现只支持单次调用 then 方法,原生 Promise 支持链式调用和多次 then

  • 状态不可逆转: 一旦 Promise 的状态从 PENDING 转变为 FULFILLEDREJECTED,就不能再次改变状态。