1. promise then

311 阅读1分钟
  1. 巧用发布订阅 此处的异步执行如果在.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()
            })
        }