// 手写Promise
// promise.then微任务
class MyPromise {
constructor(fn) {
try {
fn(this.resolve.bind(this), this.reject.bind(this));
} catch {
}
}
state = 'PENDING';
message = undefined;
successCallbacks = [];
failCallbacks = [];
resolve(val) {
setTimeout(() => {
this.state = 'FULFILLED';
this.message = val;
this.successCallbacks.forEach(fn => {
fn(this.message)
})
})
}
reject(err) {
setTimeout(() => {
this.state = 'REJECTED';
this.message = err;
this.failCallbacks.forEach(fn => {
fn(this.message)
})
})
}
then(successFn, failFn) {
if(this.state === 'PENDING') {
this.successCallbacks.push(successFn);
this.failCallbacks.push(failFn);
}
if(this.state === 'FULFILLED') {
successFn(this.message);
}
if(this.state === 'REJECTED') {
failFn(this.message);
}
}
}
MyPromise.all = function(promises) {
const len = promises.length;
const result = [];
let count = 0;
return new Promise((resovle, reject) => {
for(let i=0; i<len; i++) {
promises[i].then(res => {
count++;
result.push(res);
if(count === length) {
resolve(result);
}
},err => {
reject(err);
})
}
})
}
MyPromise.race = function(promises) {
let flag = true;
const len = promises.length;
return new Promise((resolve, reject) => {
for(let i=0; i<len; i++) {
promises[i].then(res => {
if(flag) {
resolve(res);
flag = false;
}
}, err => {
reject(err);
})
}
})
}
const p = new MyPromise((resolve, reject) => {
resolve(3);
console.log(1);
throw new Error('err');
}).then(res => {
console.log(res);
}, err => {
console.log(err);
})
console.log(2);
console