promise
by Paco86
JavaScript
const PENDING = 'pending';
const RESOLVED = 'resolved';
const REJECTED = 'rejected';
const MyPromise= function (fn) {
// 保存初始化状态
const self = this;
// 初始化状态
self.state = PENDING;
// 用于保存 resolve 或者 rejected 传入的值
self.value = null;
self.error = null;
// 异步任务: 用于保存 resolve 的回调函数
self.resolvedCallbacks = [];
// 异步任务: 用于保存 reject 的回调函数
self.rejectedCallbacks = [];
function resolve(value) {
if (self.state === PENDING) {
self.state = RESOLVED;
self.value = value;
// 执行回调函数
self.resolvedCallbacks.forEach(callback => callback(value));
}
}
function reject(error) {
if (self.state === PENDING) {
self.state = REJECTED;
self.error = error;
// 执行回调函数
self.rejectedCallbacks.forEach(callback => callback(error));
}
}
try {
fn(resolve, reject);
} catch (e) {
reject(e);
}
};
MyPromise.prototype.then = function (onResolvedFn, onRejectedFn) {
if (this.state === PENDING) {
this.resolvedCallbacks.push(onResolvedFn);
this.rejectedCallbacks.push(onRejectedFn);
}
if (this.state === RESOLVED) {
onResolvedFn(this.value);
}
if (this.state === REJECTED) {
onRejectedFn(this.error);
}
};
// test
const p1 = new MyPromise((resolve, reject) => {
setTimeout(() => {
resolve('success');
}, 2000);
});
const p2 = new MyPromise((resolve, reject) => {
setTimeout(() => {
reject('fail');
}, 1000);
});
p1.then((res)=>{
console.log(res);
}, (error)=>{
console.log(error)
}
);
p2.then((res)=>{
console.log(res);
}, (error)=>{
console.log(error)
}
);