class Promise {
constructor(executor) {
(this.promiseResult = null), (this.promiseState = "pending");
this.callback = [];
let self = this;
function resolve(data) {
if (self.promiseState !== "pending") return;
(self.promiseState = "resolved"), (self.promiseResult = data);
setTimeout(()=>{
self.callback.forEach((item) => {
item.onResolve(data);
});
})
}
function reject(data) {
if (self.promiseState !== "pending") return;
(self.promiseResult = data), (self.promiseState = "rejected");
setTimeout(()=>{
self.callback.forEach((item) => {
item.onReject(data);
});
})
}
try {
executor(resolve, reject);
} catch (e) {
reject(e);
}
}
then(onResolve, onReject) {
let self = this;
if (typeof onReject !== "function") {
onReject = (row) => {
throw row;
};
}
if (typeof onResolve !== "function") {
onResolve = (value) => value;
}
return new Promise((resolve, reject) => {
function callback(type) {
try {
let result = type(self.promiseResult);
if (result instanceof Promise) {
result.then(
(v) => {
resolve(v);
},
(r) => {
reject(r);
}
);
} else {
resolve(result);
}
} catch (error) {
reject(error);
}
}
if (this.promiseState === "resolved") {
setTimeout(()=>{
callback(onResolve);
})
}
if (this.promiseState === "rejected") {
setTimeout(()=>{
callback(onReject);
})
}
if (this.promiseState === "pending") {
this.callback.push({
onResolve: function () {
callback(onResolve);
},
onReject: function () {
callback(onReject);
},
});
}
});
}
catch(onReject) {
return this.then(undefined, onReject);
}
static resolve(value) {
return new Promise((resolve, reject) => {
if (value instanceof Promise) {
value.then(
(v) => {
resolve(v);
},
(r) => {
reject(r);
}
);
} else {
resolve(value);
}
});
}
static reject(value) {
return new Promise((resolve, reject) => {
reject(value);
});
}
static all(promises) {
return new Promise((resolve, reject) => {
let count = 0;
let arr = [];
for (let i = 0; i < promises.length; i++) {
count++;
promises[i].then(
(v) => {
arr[i] = v;
if (count === promises.length) {
resolve(arr);
}
},
(r) => {
reject(r);
}
);
}
});
}
static race(promises) {
return new Promise((resolve, reject) => {
for (let i = 0; i < Promise.length; i++) {
promises[i].then(
(v) => {
resolve(v);
},
(r) => {
reject(r);
}
);
}
});
}
}