promise简单实现
const PENDING = 'pending';
const FULLFILLED = 'fullfilled';
const REJECTED = 'rejected';
function Mypromise(fn) {
const self = this;
this.state = PENDING;
this.value = null;
this.reason = null;
this.resolveCb = [];
this.rejectedCb = [];
let resolve = function (value) {
self.state = FULLFILLED;
self.value = value;
self.resolveCb.forEach(handler => {
handler(value);
});
};
let rejected = function (reason) {
self.state = REJECTED;
self.reason = reason;
self.rejectedCb.forEach(handler => {
handler(reason);
});
};
try {
fn(resolve, rejected);
} catch (err) {
rejected(err);
}
}
Mypromise.prototype.then = function (onFullfilled, onRejected) {
onFullfilled = typeof onFullfilled === 'function' ? onFullfilled : () => { };
onRejected = typeof onRejected === 'function' ? onRejected : () => { };
if (this.state === FULLFILLED) {
return new Mypromise((resolve, rejected) => {
if (this.value instanceof Mypromise) {
this.value.then(onFullfilled, onRejected);
} else {
try {
resolve(onFullfilled(this.value));
} catch (err) {
rejected(err);
}
}
})
}
if (this.state === REJECTED) {
return new Mypromise((resolve, rejected) => {
try {
resolve(onRejected(this.reason));
} catch (err) {
rejected(err);
}
})
}
if (this.state === PENDING) {
return new Mypromise((resolve, rejected) => {
this.resolveCb.push(() => {
if (this.value instanceof Mypromise) {
this.value.then(onFullfilled, onRejected);
} else {
try {
resolve(onFullfilled(this.value));
} catch (err) {
rejected(err);
}
}
});
this.rejectedCb.push(() => {
try {
resolve(onRejected(this.reason));
} catch (err) {
rejected(err);
}
});
});
}
}
new Mypromise((resolve, rejected) => {
console.log('1');
resolve('成功');
console.log('2');
}).then(val => {
console.log(val);
return '哈哈哈';
}).then(val => {
console.log(val);
});