仅记录下来为自己日后观看。
// 1、基本结构
function myPromise(data) {
let self = this;
self.status = "pending"; //状态
self.value = null; //成功之后返回的数据
self.reason = null; //失败的原因
//7.解决异步问题=》 暂存区
self.onFulffilledCallbacks = [];
self.onRejectedCallbacks = [];
function resolve(value) {
//返回成功的结果
// 5.1
if (self.status === "pending") {
self.value = value; //保存成功的结果
self.status = "fulfilled"; //将状态改为成功
// 9.状态改变之后=》去除暂存区的方法
self.onFulffilledCallbacks.forEach((v) => v(value));
}
}
// 5.2
function reject(reason) {
if (self.status === "pending") {
self.reason = reason; //失败的原因
self.status = "rejected"; //将状态改为失败
self.onRejectedCallbacks.forEach((v) => v(reason));
}
}
// 4.立即执行
data && data(resolve, reject);
}
//2 .then 在原型上添加.then方法 不管成功还是失败都会执行
myPromise.prototype.then = function (onFulffilled, onRejected) {
// 6.确保传进来的时方法,如果不是,自己定义一个方法
onFulffilled =
typeof onFulffilled === "function"
? onFulffilled
: function (data) {
console.log(resolve());
resolve(data);
};
onRejected =
typeof onRejected === "function"
? onRejected
: function (err) {
throw err;
};
let self = this;
if (self.status === "pending") {
// 8.暂存回调函数
self.onFulffilledCallbacks.push(onFulffilled);
self.onRejectedCallbacks.push(onRejected);
}
};
// 3.初级调用
let demo = new myPromise((resolve, reject) => {
console.log(2);
setTimeout(() => {
resolve(999);
}, 2000);
});
demo.then((data) => console.log(data));