function MyPromise(excutor) {
this.state = 'Pending';
this.resolveFuncCallbacks = [];
this.rejctedFuncCallbacks = [];
const self = this;
function resovle() {
if (self.state === 'pending') {
self.state = 'fullfied';
self.resolveFuncCallbacks.forEach(item => item(self.value));
}
}
function reject() {
if (self.state === 'pending') {
self.state = 'rejected';
self.rejctedFuncCallbacks.forEach(item => item(self.reason));
}
}
try {
excutor(resovle, reject);
} catch (e) {
console.log(e);
}
}
MyPromise.prototype.then = function (resovleFunc, rejctedFunc) {
resovleFunc = typeof resovleFunc === 'function' ? resovleFunc : (resovleFunc) => resovleFunc;
rejctedFunc = typeof rejctedFunc === 'function' ? resovleFunc : (rejctedFunc) => rejctedFunc;
const self = this;
return new MyPromise((resolve, reject) => {
console.log('MyPromise', 2222);
const decorateResolveFunc = function(value) {
const result = resovleFunc(value);
return result instanceof MyPromise ? result.then(resolve, reject) : result;
}
const decorateRejectFunc = function(reason) {
const result = rejctedFunc(reason);
return result instanceof MyPromise ? result.then(resolve, reject) : result;
}
if (self.state === 'pending') {
self.resolveFuncCallbacks.push(decorateResolveFunc);
self.rejctedFuncCallbacks.push(decorateRejectFunc);
}
if (self.state === 'fullfied') {
decorateResolveFunc(self.value);
}
if (self.state) {
decorateRejectFunc(self.reason);
}
})
}
const p1 = new MyPromise((resolve, reject) => {
resovle('33');
})
p1.then((val) => {
console.log('then', val);
return val;
}, (reason) => {
console.log('then', reason);
return reason;
}).then(res => console.log('then, then', res))
console