// 定义Promise
function myPromise(excutor) {
let self = this;
self.status = "pending"; // 定一个状态
self.value = null; // 成功的返回的结果
self.reason = null; //失败的原因
// 7. 解决异步问题 暂存区
self.onFulfilledCallbacks = [];
self.onRejectedCallbacks = [];
// 成功的回调
function resolve(value) {
// 5.1
if (self.status === "pending") {
self.value = value; // 成功之后返回的数据
self.status = "fulfilled";
// 9. 状态改变 依次取出执行
self.onFulfilledCallbacks.forEach((item) => item(value));
}
}
// 失败的回调
function reject(reason) {
// 5.2
if (self.status === "pending") {
self.value = reason; // 失败的原因
self.status = "rejected";
// 9. 状态改变 依次取出执行
self.onRejectedCallbacks.forEach((item) => item(reason));
}
}
// 4. 立即执行
// excutor && excutor(resolve, reject)
try {
excutor(resolve, reject);
} catch (error) {
reject(error);
}
}
// 2. then
myPromise.prototype.then = function (onFulilled, onRejected) {
// 6.
onFulilled =
typeof onFulilled === "function"
? onFulilled
: function (data) {
resolve(data);
};
//
onRejected =
typeof onRejected === "function"
? onRejected
: function (err) {
throw new Error(err);
};
let self = this;
if (self.status === "fulfilled") {
return new myPromise((resolve, reject) => {
try {
let x = onFulilled(self.value);
x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
} catch (error) {
reject(error);
}
});
}
if (self.status === "rejected") {
return new myPromise((resolve, reject) => {
try {
let x = onRejected(self.value);
x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
} catch (error) {
reject(error);
}
});
}
if (self.status === "pending") {
return new myPromise((resolve, reject) => {
self.onFulfilledCallbacks.push(() => {
let x = onFulilled(self.value);
x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
});
self.onRejectedCallbacks.push(() => {
let x = onRejected(self.value);
x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
});
});
}
};
myPromise.prototype.catch = function (fn) {
return this.then(null, fn);
};
本篇
手写Promise
手写Promise
2022-07-19
下一篇
Axios + TypeScript class 的 封装
Axios + TypeScript class 的 封装
2022-07-13