class PromiseNew{
constructor(fn){
this.satate="PENDING"
this.doneList = []
this.failList = []
fn(this.resolve.bind(this) ,this.reject.bind(this)) //fn是外部函数,里面this已经改变,所以要绑定bind
}
done(handle){
if(typeof handle ==="function"){
this.doneList.push(handle)
}else{
throw new Error("缺少回调函数")
}
return this
}
fail(handle){
if(typeof handle ==="function"){
this.failList.push(handle)
}else{
throw new Error("缺少回调函数")
}
return this
}
then(success,fail){
this.done(success || function(){}).fail(fail || function(){})
return this
}
resolve () {
this.satate="RESOLVED"
let args =Array.prototype.slice.call(arguments)
setTimeout(function(){
this.doneList.forEach((item, key) => {
let arg = item.apply(null,args) //实际上doneList中第一个函数的返回值是第二个函数的参数
args = [] //清空参数
args.push(arg)
});
this.doneList =[] //清空数据
}.bind(this), 200)
return this
}
reject(){
this.satate="REJECTED"
let args =Array.prototype.slice.call(arguments)
setTimeout(function(){
this.failList.forEach((item, key) => {
let arg = item.apply(null,args)
args = []
args.push(arg)
});
this.failList =[] //清空数据
}.bind(this), 200)
console.log("reject 执行")
}
}
new PromiseNew((resolve,reject)=>{
resolve("啪啪啪")
reject()
console.log("ben")
}).then((value)=>{
console.log("success",value)
return 9999
},()=>{
console.log("fail")
})