function MyPromise(func) {
let self = this;
self.value = null;
self.status = 'pending';
self.onfullfill = [];
self.onreject = [];
function resolve(value) {
self.value = value;
self.status = 'fullfill';
self.onfullfill.forEach((onfullfill) => {
onfullfill(self.value);
})
}
function reject(reason) {
self.value = reason;
self.status = 'reject';
self.onreject.forEach((onreject) => {
onreject(self.value);
})
}
func(resolve, reject);
}
MyPromise.prototype.then = function (onfullfill, onreject) {
let self = this;
if (self.status == 'pending') {
self.onfullfill.push(onfullfill);
self.onreject.push(onreject);
}
if (self.status == 'fullfill') {
onfullfill(self.value);
}
if (self.status == 'reject') {
onreject(self.value);
}
}
MyPromise.prototype.then1 = function (onfullfill, onreject) {
let self = this;
onfullfill = typeof onfullfill == 'function' ? onfullfill : val => val
onreject = typeof onreject == 'function' ? onreject : val => val
let promise2 = new MyPromise((resolve, reject) => {
if (self.status == 'pending') {
self.onfullfill.push(onfullfill);
self.onreject.push(onreject);
}
if (self.status == 'fullfill') {
setTimeout(() => {
let x = onfullfill(self.value);
resolvePromise(x, promise2, resolve, reject)
}, 0);
}
if (self.status == 'reject') {
setTimeout(() => {
let x = onreject(self.value);
resolvePromise(x, promise2, resolve, reject)
}, 0);
}
})
function resolvePromise(x, promise2, resolve, reject) {
if (x === promise2) {
reject(new Error('循环引用'));
}
if (x != null && (typeof x == 'object' || typeof x == 'function')) {
if (x instanceof MyPromise) {
x.then1(res => {
resolePromise(res, resolve, reject);
}, rej => {
resolePromise(rej, resolve, reject)
})
} else {
reject('返回值必须为基本类型或者MyPromise')
}
} else {
resolve(x);
}
}
return promise2;
}
MyPromise.prototype.catch = function (onrejected) {
return this.then1(null, onrejected)
}
MyPromise.reject = function (reason) {
return new MyPromise((resolve, reject) => {
reject(reason)
})
}
MyPromise.resolve = function (value) {
return new MyPromise((resolve, reject) => {
resolve(value);
})
}
参考文献
前端面试考点之—手写Promise
只会用?一块儿来手写一个合乎规范的Promise
Promise测试站点前端