- 巧用发布订阅 此处的异步执行如果在.then里需要取到值,那么源码里就会用到发布订阅
let promise1 = new Promise1((resolved,rejected)=>{
setTimeout(()=>{
resolved(1)
},3000)
// rejected(1)
})
而且有个特性,同一个promise实例可以两个.then
promise.then
promise.then
then(onFufilled,onRejected){ // 原型上的方法
if(this.state === RESOLVE){ // 根据私有属性里的值,来判定当前的状态
onFufilled(this.value) // 把成功属性传入成功回调
}
if(this.state === REJECTED){
onRejected(this.reason)
}
if(this.state === PENDING){
this.onResolveCallback.push(()=>{ // 这个是存储状态值的数组池
onFufilled(this.value) // 这个是.then里第一个回调函数,用切片思维存储,并且把this.value(这个成功状态传入的值)
})
this.onRejectCallback.push(()=>{
onRejected(this.reason)
})
}
}
这个时候的.then的成功/失败事件池就会放到resolve触发的时候
let resolve = (value)=>{ // value=>这个是成功态以后传给函数回调的参数,也就是resolve(1)的1
if(this.state!==PENDING)return
// 1. 这个函数并不是实例上的,所以用let
// 每次声明promise都会let一个新的
this.value = value // 调用回调的参数传给自身的成功态的值做修改
this.state = RESOLVE // 成功以后把自身不可逆的状态修改
this.onResolveCallback.forEach((item)=>{
item()
})
}