首页 > 其他 > 详细

promise 实现

时间:2021-06-02 09:41:34      阅读:22      评论:0      收藏:0      [点我收藏+]
1实现异步调用
const PENDDING = ‘pendding‘,
    RESOLVED = ‘resolved‘,
    REJECTED = ‘rejected‘
	
    class myPromise {
        constructor(handler){
            this.status = PENDDING
            this.value = undefined
            this.resolveCallback = []
            this.rejectCallback = []
            let resolve = (value)=>{
                if(this.status === PENDDING){
                    this.status = RESOLVED
                    this.value = value
                    this.resolveCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            let reject = (error)=>{
                if(this.status === PENDDING){
                    this.status = REJECTED
                    this.reason = error
                    this.rejectCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            try{
                handler(resolve,reject)
            }catch{
                reject(error)
            }
        }
        then(onResolve=val=>val,onReject){
            if(this.status === PENDDING){
                this.resolveCallback.push(()=>onResolve(this.value))
            }
            if(this.status === RESOLVED){
                onResolve(this.value)
            }
            if(this.status === REJECTED){
                onReject(this.reason)
            }
        }
    }

    new myPromise((resolve)=>{
        setTimeout(()=>{
            resolve(123)
        },2000)
    }).then((res)=>{
        console.log(res)
    })

2.实现 链式调用并返回普通值 主要是promiseResultProduce这个函数

 const PENDDING = ‘pendding‘,
    RESOLVED = ‘resolved‘,
    REJECTED = ‘rejected‘
    class myPromise {
        constructor(handler){
            this.status = PENDDING
            this.value = undefined
            this.resolveCallback = []
            this.rejectCallback = []
            let resolve = (value)=>{
                if(this.status === PENDDING){
                    this.status = RESOLVED
                    this.value = value
                    this.resolveCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            let reject = (error)=>{
                if(this.status === PENDDING){
                    this.status = REJECTED
                    this.reason = error
                    this.rejectCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            try{
                handler(resolve,reject)
            }catch{
                reject(error)
            }
        }
        promiseResultProduce(promise2,val,resolve,reject){
            if(val instanceof myPromise){

            }else if((typeof val === ‘object‘ || typeof val === ‘function‘)){
                if(typeof val.then === ‘function‘){

                }else{
                    resolve(val)
                }
            }else{
                resolve(val)
            }
        }
        then(onResolve=val=>val,onReject){
            if(this.status === PENDDING){
                const promise2 = new myPromise((resolve,reject)=>{
                    this.resolveCallback.push(()=>{
                        let val = onResolve(this.value)
                        setTimeout(()=>{
                            this.promiseResultProduce(promise2,val,resolve,reject)
                        },0)
                    })
                })
                return promise2
            }
            if(this.status === RESOLVED){
                const promise2 = new myPromise((resolve,reject)=>{
                    let val = onResolve(this.value)
                    setTimeout(()=>{
                        this.promiseResultProduce(promise2,val,resolve,reject)
                    },0)
                })
                return promise2
            }
            if(this.status === REJECTED){
                onReject(this.reason)
            }
        }
    }
    
    new myPromise((resolve)=>{
        setTimeout(()=>{
            resolve(123)
        },2000)
    }).then((res)=>res)
    .then((res)=>{
        console.log(res)
        return res
    }).then((res)=>{
        console.log(res)
    })

3 实现 支持promise对象

    const PENDDING = ‘pendding‘,
    RESOLVED = ‘resolved‘,
    REJECTED = ‘rejected‘
    class myPromise {
        constructor(handler){
            this.status = PENDDING
            this.value = undefined
            this.resolveCallback = []
            this.rejectCallback = []
            let resolve = (value)=>{
                if(this.status === PENDDING){
                    this.status = RESOLVED
                    this.value = value
                    this.resolveCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            let reject = (error)=>{
                if(this.status === PENDDING){
                    this.status = REJECTED
                    this.reason = error
                    this.rejectCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            try{
                handler(resolve,reject)
            }catch{
                reject(error)
            }
        }
        promiseResultProduce(promise2,val,resolve,reject){
            if(val instanceof myPromise){
                if(val.status === PENDDING){
                    console.log(222)
                    val.then(y=>{
                        console.log(y)
                        this.promiseResultProduce(promise2,y,resolve,reject)
                    },reject)
                }else{
                    /*注意此时val是promise自然有this.value,this.status,this.reason属性*/
                    val.status === RESOLVED && resolve(val.value)
                    val.status === REJECTED && reject(val.reason)
                }
            } else if((typeof val === ‘object‘ || typeof val === ‘function‘)){

            } else{
                console.log(1111)
                resolve(val)
            }
        }
        then(onResolve=val=>val,onReject){
            if(this.status === PENDDING){
                const promise2 = new myPromise((resolve,reject)=>{
                    this.resolveCallback.push(()=>{
                        let val = onResolve(this.value)
                        setTimeout(()=>{
                            this.promiseResultProduce(promise2,val,resolve,reject)
                        },0)
                    })
                })
                return promise2
            }
            if(this.status === RESOLVED){
                const promise2 = new myPromise((resolve,reject)=>{
                    let val = onResolve(this.value)
                    this.resolveCallback.push(()=>{
                        setTimeout(()=>{
                            this.promiseResultProduce(promise2,val,resolve,reject)
                        },0)
                    })
                })
                return promise2
            }
            if(this.status === REJECTED){
                onReject(this.reason)
            }
        }
    }

    new myPromise((resolve)=>{
        setTimeout(()=>{
            resolve(123)
        },2000)
    })
    .then((res)=>{
        console.log(res)
        return new myPromise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(666)
            },2000)
        })
    })
    .then((res)=>{
        console.log(res)
    })

4支持thenable对象

    const PENDDING = ‘pendding‘,
    RESOLVED = ‘resolved‘,
    REJECTED = ‘rejected‘
    class myPromise {
        constructor(handler){
            this.status = PENDDING
            this.value = undefined
            this.resolveCallback = []
            this.rejectCallback = []
            let resolve = (value)=>{
                if(this.status === PENDDING){
                    this.status = RESOLVED
                    this.value = value
                    this.resolveCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            let reject = (error)=>{
                if(this.status === PENDDING){
                    this.status = REJECTED
                    this.reason = error
                    this.rejectCallback.forEach((cb)=>{
                        cb()
                    })
                }
            }
            try{
                handler(resolve,reject)
            }catch{
                reject(error)
            }
        }
        promiseResultProduce(promise2,val,resolve,reject){
            if(val instanceof myPromise){
                if(val.status === PENDDING){
                    val.then(y=>{
                        this.promiseResultProduce(promise2,y,resolve,reject)
                    },reject)
                }else{
                    /*注意此时val是promise自然有this.value,this.status,this.reason属性*/
                    val.status === RESOLVED && resolve(val.value)
                    val.status === REJECTED && reject(val.reason)
                }
            } else if((typeof val === ‘object‘ || typeof val === ‘function‘)){
                if(typeof val.then === ‘function‘){
                    val.then(y=>{
                        this.promiseResultProduce(promise2,y,resolve,reject)
                    },reject)
                }else{
                    resolve(val)
                }
            } else{
                resolve(val)
            }
        }
        then(onResolve=val=>val,onReject){
            if(this.status === PENDDING){
                const promise2 = new myPromise((resolve,reject)=>{
                    this.resolveCallback.push(()=>{
                        let val = onResolve(this.value)
                        setTimeout(()=>{
                            this.promiseResultProduce(promise2,val,resolve,reject)
                        },0)
                    })
                })
                return promise2
            }
            if(this.status === RESOLVED){
                const promise2 = new myPromise((resolve,reject)=>{
                    let val = onResolve(this.value)
                    this.resolveCallback.push(()=>{
                        setTimeout(()=>{
                            this.promiseResultProduce(promise2,val,resolve,reject)
                        },0)
                    })
                })
                return promise2
            }
            if(this.status === REJECTED){
                onReject(this.reason)
            }
        }
    }
    // 支持thenable对象
    // let result = {
    //     then(r){
    //         r(444)
    //     }
    // }
    // result.then(y=>{
    //     console.log(y)
    // })

    /*穿透的原理*/
    // new myPromise((resolve)=>{
    //     setTimeout(()=>{
    //         resolve(123)
    //     },2000)
    // }).then((res)=>res).then((res)=>{
    //     console.log(res)
    // })

promise 实现

原文:https://www.cnblogs.com/MDGE/p/14839460.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!