class Commitment{
static PENDING = '待定';static FULFILLED = '成功';static REJECTED = '拒绝';
constructor(func){
this.status = Commitment.PENDING;
this.result = null;
this.resolveCallback = []
this.rejectCallback = []
try {
func(this.resolve.bind(this),this.reject.bind(this))
} catch (error) {
this.reject(error)
}
}
resolve(result){
setTimeout(()=>{
if(this.status === Commitment.PENDING){
this.status = Commitment.FULFILLED;
this.result = result
this.resolveCallback.forEach(callback=>{
callback(result)
})
}
})
}
reject(result){
setTimeout(()=>{
if(this.status === Commitment.PENDING){
this.status = Commitment.REJECTED;
this.result = result
this.rejectCallback.forEach(callback=>{
callback(result)
})
}
})
}
then(onFULFILLED,onREJECTED){
onFULFILLED = typeof onFULFILLED === 'function' ? onFULFILLED:()=>{}
onREJECTED = typeof onREJECTED === 'function' ? onREJECTED:()=>{}
if(this.status === Commitment.PENDING){
this.resolveCallback.push(onFULFILLED)
this.rejectCallback.push(onREJECTED)
}
if(this.status === Commitment.FULFILLED){
setTimeout(()=>{
onFULFILLED(this.result)
})
}
if(this.status === Commitment.REJECTED){
setTimeout(()=>{
onREJECTED(this.result)
})
}
}
}
console.log('1');
let commitment = new Commitment((resolve,reject)=>{
console.log('2');
setTimeout(()=>{
resolve('yes')
reject('no')
console.log(4);
})
})
commitment.then(
result=>{console.log(result);},
result=>{console.log(result.message);}
)
console.log(3);