class _Promise {
static PENDING = "待定";
static SUCCESS = "成功";
static REJECTED = "失败";
constructor(func) {
console.log("reset");
this.status = _Promise.PENDING;
this.result = null;
this.callbackReslove = [];
this.callbackReject = [];
try {
func(this.resolve.bind(this), this.reject.bind(this));
} catch (error) {
this.reject(error);
}
}
resolve(result) {
if (this.status === _Promise.PENDING) {
this.status = _Promise.SUCCESS;
this.result = result;
this.callbackReslove.forEach((callback) => {
callback(result);
});
}
}
reject(result) {
if (this.status === _Promise.PENDING) {
this.status = _Promise.REJECTED;
this.result = result;
this.callbackReject.forEach((callback) => {
callback(result);
});
}
}
then(onSuccess, onReject) {
console.log("then start");
return new _Promise((resolve, reject) => {
onSuccess = typeof onSuccess === "function" ? onSuccess : () => {};
onReject = typeof onReject === "function" ? onReject : () => {};
if (this.status === _Promise.PENDING) {
this.callbackReslove.push(onSuccess);
this.callbackReject.push(onReject);
}
// console.log('onSuccess',this.callbackReslove,this.status);
if (this.status === _Promise.SUCCESS) {
setTimeout(() => {
let result = onSuccess(this.result);
isiPromise(result, resolve, reject);
});
}
if (this.status === _Promise.REJECTED) {
setTimeout(() => {
onReject(this.result);
isiPromise(result, resolve, reject);
});
}
});
}
catch(onReject) {
this.then(undefined, onReject);
}
all(promise) {
return new _Promise((resolve, reject) => {
let count = 0;
let arr = [];
for (let i = 0; i < promise.length; i++) {
promise[i].then(
(value) => {
count++;
arr[i] = value;
if (count === promise.length) {
resolve(arr);
}
},
(reason) => {
reject(reason);
}
);
}
});
}
}
console.log("第一步");
const a = new _Promise((resolve, reject) => {
console.log("第二步");
resolve("这次一定");
});
a.then((e) => {
console.log("then1", e);
// return 'zc3d'
return new _Promise((resolve, reject) => {
resolve("这次三定");
});
}).then((e) => {
console.log("then2", e);
});
console.log("第三步");
// 处理返回值为_Promise的时候
function isiPromise(result, resolve, reject) {
if (result instanceof _Promise) {
result.then(resolve, reject);
} else {
resolve(result);
}
}
手写Promise
最新推荐文章于 2024-05-09 23:44:19 发布