function myPromise(fn){
this.state = 'Pending'
this.value
this.resolve = function(){
if(this.state != 'Pending'){
return
}
this.state = 'fulfilled'
this.value = arguments
}
this.reject = function(){
this.state = 'rejected'
this.value = arguments
}
this.then = this.catch = function(callback1, callback2){
let callback = (this.state == 'fulfilled' ? callback1 : callback2)
let result = callback(...this.value)
return new myPromise((resolve)=>{ resolve(result) })
}
this.finally = function(callback) {
callback()
}
fn(this.resolve.bind(this), this.reject.bind(this))
}