大厂面试一般喜欢问的底层源码手写,废话不多说,直接上代码!
function myPromise(excutor) {
// 1、执行结构
let self = this;
self.status = 'pending';
self.value = null; // 成功结果
self.reason = null;// 失败原因
// 6、添加缓存数组
self.onFulfilledCallbacks = [];
self.onRejectedCallbacks = [];
// 4、判断状态作相应处理
function resolve(value) {
if (self.status === 'pending') {
self.value = value; // 保存成功结果
self.status = 'fulfilled';
// 8、状态改变依次取出callback
self.onFulfilledCallbacks.forEach(item => item(value))
}
};
function reject(reason) {
if (self.status === 'pending') {
self.reason = reason; // 保存失败原因
self.status = 'rejected';
// 8、状态改变依次取出callback
self.onRejectedCallbacks.forEach(item => item(reason))
}
};
// 3、执行
try {
excutor(resolve, reject)
} catch (error) {
reject(error)
};
}
// 2、then方法
myPromise.prototype.then = function (onFulfilled, onRejected) {
let self = this;
// 5、状态改变调用then方法
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function (data) { resolve(data) };
onRejected = typeof onRejected === 'function' ? onRejected : function (err) { throw err };
// 7、添加callback
// if (self.status === 'pending') {
// self.onFulfilledCallbacks.push(onFulfilled);
// self.onRejectedCallbacks.push(onRejected);
// }
if (self.status === 'fulfilled') {
return new myPromise((resolve, reject) => {
try {
let res = onFulfilled(self.value);
// 判断传入的值是不是Promise ,是就.then 不是就抛出结果
res instanceof myPromise ? res.then(resolve, reject) : resolve(x);
}
catch (err) {
reject(err)
}
})
};
if (self.status === 'rejected') {
return new myPromise((resolve, reject) => {
try {
let res = onRejected(self.value);
// 判断传入的值是不是Promise ,是就.then 不是就抛出结果
res instanceof myPromise ? res.then(resolve, reject) : resolve(x);
}
catch (err) {
reject(err)
}
})
};
if (self.status === 'pending') {
return new myPromise((resolve, reject) => {
self.onFulfilledCallbacks.push(() => {
let res = onRejected(self.value);
// 判断传入的值是不是Promise ,是就.then 不是就抛出结果
res instanceof myPromise ? res.then(resolve, reject) : resolve(x);
});
self.onRejectedCallbacks.push(() => {
let res = onRejected(self.value);
// 判断传入的值是不是Promise ,是就.then 不是就抛出结果
res instanceof myPromise ? res.then(resolve, reject) : resolve(x);
});
})
}
}
myPromise.prototype.catch = function (fn) {
return this.then(null, fn)
}