class MyPromise{
state = 'pending' //pending,fulfilled,rejected
value = '' //resolved的值
error = '' //reject的值
handleResolvedFuns = []
handleRejectFuns = []
constructor(fn){
const handleResolved = (val)=>{
if(this.state === 'pending'){
this.state='fulfilled'
this.value = val
this.handleResolvedFuns.forEach((fun)=>fun(this.value))
}
}
const handleReject = (err)=>{
if(this.state === 'pending'){
this.state='rejected'
this.value = err
this.handleRejectFuns.forEach((fun)=>fun(this.value))
}
}
try {
fn(handleResolved,handleReject)
} catch (error) {
console.log(error)
}
}
then(f1,f2){
f1 = typeof f1 === 'function'?f1:(v)=>v;
f2 = typeof f2 === 'function'?f2:(e)=>e;
if(this.state === 'pending'){
const p = new MyPromise((resolve,reject)=>{
this.handleResolvedFuns.push(()=>{
try {
const newValue = f1(this.value)
resolve(newValue)
} catch (error) {
reject(error)
}
})
this.handleRejectFuns.push(()=>{
try{
const newError = f2(this.error)
reject(newError)
}catch (error){
reject(error)
}
})
})
return p
}
if(this.state==='fullfilled'){
const p1 = new MyPromise((resolve,reject)=>{
try {
const newValue = f1(this.value);
resolve(newValue)
} catch (error) {
reject(error)
}
})
return p1
}
if(this.state==='rejected'){
const p2 = new MyPromise((resolve,reject)=>{
try{
const newError = f2(this.error)
resolve(newError)
}catch(error){
reject(error)
}
})
return p2
}
}
catch(fn){
this.then(null,fn)
}
}