话不多说直接上代码
function myPromise(constructor) {
let self = this;
self.status = 'pending' // 定义状态改变前的初始状态
self.value = undefined; // 定义状态为resolved的时候的状态
self.reason = undefined; // 定义状态为rejected的时候的状态
// 存储回调函数
self.onFulfilledCallbacks = [];
self.onRejectedCallbacks = [];
function resolve(value) {
if (self.status === 'pending') {
self.value = value;
self.status = 'resolved';
self.onFulfilledCallbacks.forEach(function(fulfilledCallback) {
fulfilledCallback();
});
}
}
function reject(reason) {
if (self.status === 'pending') {
self.reason = reason;
self.status = 'rejected';
self.onRejectedCallbacks.forEach(function(rejectedCallback) {
rejectedCallback();
});
}
}
// 捕获构造异常
try {
constructor(resolve, reject);
} catch (e) {
reject(e);
}
}
myPromise.prototype.then = function(onFullfilled, onRejected) {
let self = this;
switch (self.status) {
case 'resolved':
onFullfilled(self.value);
break;
case 'rejected':
onRejected(self.reason);
break;
case 'pending':
self.onFulfilledCallbacks.push(() => {
onFullfilled(self.value);
});
self.onRejectedCallbacks.push(() => {
onRejected(self.reason);
});
break;
default:
}
}
new myPromise((resolve) => {
console.log(1);
setTimeout(() => {
console.log(2);
resolve(3)
}, 2000);
}).then(value => console.log(value))
new myPromise((resolve) => {
console.log(4);
resolve(5)
}).then(value => console.log(value))