简版Promise

40 阅读1分钟
class Promise2{
    #status = 'pending'
    constructor(f){
        this.queue = []
        const resolve =(data)=>{
            this.#status = "fulfilled"
            const f1f2 = this.queue.shift()
            if(!f1f2 || !f1f2[0]){
                return
            }
            const x = f1f2[0].call(undefined,data)
            if(x instanceof Promise2){
                x.then((data)=>{
                    // 成功调用下一个f1
                    resolve(data)
                },(reason)=>{
                    // 失败调用下一个f2
                    reject(reason)
                })
            }else{
                // 如果类型不是Promise2就认为成功了
                resolve(x)
            }
        }
        const reject = (reason)=>{
            this.#status = "rejected"
            const f1f2 = this.queue.shift()
            if(!f1f2 || !f1f2[1]){
                return
            }
            const x = f1f2[1].call(undefined,reason)
            if(x instanceof Promise2){
                x.then((data)=>{
                    // 成功调用下一个f1
                    resolve(data)
                },(reason)=>{
                    // 失败调用下一个f2
                    reject(reason)
                })
            }else{
                // 如果类型不是Promise2就认为成功了
                resolve(x)
            }
        }
        f.call(undefined,resolve,reject)
    }
    // then方法相当于将f1f2暂存到一个队列中
    then(f1,f2){
        this.queue.push([f1,f2])
    }
}
// 验证
const p = new Promise2(function(resolve,reject){
    setTimeout(()=>{
        reject("hi")
    },3000)
})
p.then((data)=>{
    console.log("data",data)
},(reason)=>{
    console.log("reason",reason)
})