new MyPromise((resolve, reject) => {
reject('ERROR');
}).then(result => {console.log(result)})
最基本的Promise (没有数显then链)
class MyPromise {
constructor(executor) {
this.status = 'pending';
this.value = undefined;
this.resolveArr = [];
this.rejectArr = [];
let change = (status, value) => {
if (this.status !== 'pending') return;
this.value = value;
this.status = status;
let fnArr = status === 'resolved' ? this.resolveArr : this.rejectArr;
fnArr.forEach(item => {
if (typeof item !== 'function') return;
item(this.value);
});
};
let resolve = result => {
if (this.resolveArr.length > 0) {
change('resolved', result);
return;
}
let delayTimer = setTimeout(_ => {
change('resolved', result);
clearTimeout(delayTimer);
}, 0);
};
let reject = reason => {
if (this.rejectArr.length > 0) {
change('rejected', reason);
return;
}
let delayTimer = setTimeout(_ => {
change('rejected', reason);
clearTimeout(delayTimer);
}, 0);
};
try {
executor(resolve, reject);
} catch (err) {
reject(err.message);
}
}
then(resolveFn, rejectFn) {
this.resolveArr.push(resolveFn);
this.rejectArr.push(rejectFn);
}
}