`class MyPromise { constructor(fn) { this.state = 'pending'; this.successFun = []; this.failFun = [];
let resolve = (val) => {
if (this.state !== 'pending') return;
this.state = 'success';
setTimeout(() => {
this.successFun.forEach((fun) => fun.call(this, val));
});
};
let reject = (err) => {
if (this.state !== 'pending') return;
this.state = 'fail';
setTimeout(() => {
this.failFun.forEach((fun) => fun.call(this, err));
});
};
try {
fn(resolve, reject);
} catch (error) {
reject(error);
}
}
then(resolveCb, rejectCb) {
resolveCb = typeof resolveCb !== 'function' ? (v) => v : resolveCb;
rejectCb =
typeof rejectCb !== 'function'
? (err) => {
throw err;
}
: rejectCb;
return new MyPromise((resolve, reject) => {
this.successFun.push((val) => {
let x = resolveCb(val);
x instanceof MyPromise ? x.then(resolve, reject) : resolve(x);
});
this.failFun.push((val) => {
let x = rejectCb(val);
x instanceof MyPromise ? x.then(resolve, reject) : reject(x);
});
});
}
static all(promiseArr) {
let result = [];
return new MyPromise((resolve, reject) => {
for (let i = 0; i < promiseArr.length; i++) {
promiseArr[i].then(
(res) => {
result.push(res);
if (i === promiseArr.length - 1) {
resolve(result);
}
},
(err) => {
result(err);
}
);
}
});
}
static race(promiseArr) {
return new MyPromise((resolve, reject) => {
for (let i = 0; i < promiseArr.length; i++) {
promiseArr[i].then(
(res) => {
resolve(res);
},
(err) => {
reject(err);
}
);
}
});
}
}
module.exports = MyPromise; `