export enum PromiseStatus {
PENDING = 'pending',
FULFILLED = 'fulfilled',
REJECTED = 'rejected',
}
export default class MyPromise {
private state: PromiseStatus = PromiseStatus.PENDING;
// 成功结果
private value: any = undefined;
// 失败错误
private error: any = undefined;
// 成功回调列表
fulfilledList: ((val: any) => any)[] = [];
// 失败回调列表
rejectedList: ((val: any) => any)[] = [];
constructor(executor: any) {
try {
executor(this._resolve.bind(this), this._reject.bind(this));
} catch (e) {
console.log('start error');
this._reject(e);
}
}
private _resolve(value) {
if (this.state === PromiseStatus.PENDING) {
this.state = PromiseStatus.FULFILLED;
this.value = value;
this.fulfilledList.forEach((fn) => fn(value));
}
}
private _reject(error) {
console.log('go', this.state, this.rejectedList.length);
if (this.state === PromiseStatus.PENDING) {
this.state = PromiseStatus.REJECTED;
this.error = error;
if (this.rejectedList.length > 0) {
this.rejectedList.forEach((fn) => {
fn(error);
});
} else {
throw new Error('Unhandled promise rejection Error: ' + error?.message);
}
}
}
then(onFulfilled: any, onRejected?: any) {
return new MyPromise((res, rej) => {
if (
this.state === PromiseStatus.FULFILLED &&
typeof onFulfilled === 'function'
) {
try {
const newValue = onFulfilled(this.value);
res(newValue);
} catch (e) {
rej(e);
}
}
if (
this.state === PromiseStatus.REJECTED &&
typeof onRejected === 'function'
) {
const newError = onRejected(this.error);
rej(newError);
}
if (this.state === PromiseStatus.PENDING) {
typeof onFulfilled === 'function' &&
this.fulfilledList.push((value) => {
try {
const newValue = onFulfilled(value);
res(newValue);
} catch (e) {
rej(e);
}
});
if (typeof onRejected === 'function') {
this.rejectedList.push((error) => {
const newError = onRejected(error);
rej(newError);
});
} else {
this.rejectedList.push((error) => {
rej(error);
});
}
}
});
}
catch(onRejected) {
return new MyPromise((res, rej) => {
if (
this.state === PromiseStatus.REJECTED &&
typeof onRejected === 'function'
) {
const result = onRejected(this.error);
res(result);
}
if (this.state === PromiseStatus.PENDING) {
if (typeof onRejected === 'function') {
this.rejectedList.push((error) => {
const newError = onRejected(error);
res(newError);
});
} else {
this.rejectedList.push((error) => {
rej(error);
});
}
}
});
}
}
手写个简易版 Promise
最新推荐文章于 2024-07-14 12:56:18 发布