实现简单的 Promise
安装 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
变为FULFILLED
或REJECTED
,便不可逆转。 -
构造函数: 接受一个执行器函数
executor
,该函数在实例化时立即执行,并传入resolve
和reject
两个函数,用于改变Promise
的状态。 -
then
方法: 根据当前Promise
的状态,调用相应的回调函数onFulfilled
或onRejected
。
使用示例
在上面的示例中,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
转变为FULFILLED
或REJECTED
,就不能再次改变状态。