美文网首页前端
自定义promise

自定义promise

作者: 菜蚴菜 | 来源:发表于2022-05-30 23:07 被阅读0次

    promise的详细介绍-来源博客(YK菌

    1、自定义Promise 函数版本 IIFE
    (function (window) {
        const PENDING = "pending"
        const RESOLVED = "resolved"
        const REJECTED = "rejected"
        /**promise 构造函数   excutor执行器函数*/
        function Promise(excutor) {
            //给promise对象指定status属性,初始值为pending
            this.status = PENDING
            //给promise对象指定一个用于存储结果数据的属性
            this.data = undefined;
            //每个元素的结构 {onResolved(){},onrejected(){}}
            this.callbacks = []
            let self = this;
            function resolve(value) {
                //状态更改过以后不再执行
                if (self.status !== PENDING) {
                    return
                }
                //更改状态
                self.status = RESOLVED
                //保存value数据
                self.data = value
                //如果有待执行cakkback函数,立即异步执行回调函数
                if (self.callbacks.length > 0) {
                    setTimeout(() => {//放入队列中执行所有成功的回调
                        self.callbacks.forEach(callbacksObj => {
                            callbacksObj.onResolved(value)
                        });
                    })
    
                }
            }
            function reject(reason) {
                //状态更改过以后不再执行
                if (self.status !== PENDING) {
                    return
                }
                //更改状态
                self.status = REJECTED
                //保存value数据
                self.data = reason
                //如果有待执行cakkback函数,立即异步执行回调函数
                if (self.callbacks.length > 0) {
                    setTimeout(() => {//放入队列中执行所有失败的回调
                        self.callbacks.forEach(callbacksObj => {
                            callbacksObj.onRejected(reason)
                        });
                    })
    
                }
            }
            try {
                //立即同步执行excutor
                excutor(resolve, reject)
            } catch (error) {//如果执行器抛出异常
                reject(error)
            }
    
        }
    
        /**原型上的then*/
        Promise.prototype.then = function (onResolved, onRejected) {
            let self = this;
            onResolved = typeof onResolved === 'function' ? onResolved : value => value
            //实现异常穿透
            onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
    
            //返回一个新的promise对象
            return new Promise((resolve, reject) => {
                //调用指定回调函数处理,根据执行结果,改变return的promise状态
                function handle(fn) {
                    /**
                         1、如果执行抛出异常 return的promise就会失败,reason就是error
                         2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                         3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                        */
                    try {
                        let result = fn(self.data)
                        //    3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                        if (result instanceof Promise) {
                            result.then(resolve, reject)
                            //等价于
                            // result.then(
                            //     value => {resolve(value)},
                            //     reason => {reject(reason)}
                            // )
                        } else {
                            // 2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                            resolve(result)
                        }
                    } catch (err) {
                        reject(err)
                    }
                }
                //如果状态还没有被更改此时缓存回调函数
                if (self.status === RESOLVED) {
                    //如果是状态已经更改过了,回调函数放入队列中,并改变promise的状态
                    setTimeout(() => {
                        handle(onResolved)
                    })
                } else if (self.status === REJECTED) {//rejected
                    //如果是状态已经更改过了,回调函数放入队列中
                    setTimeout(() => {
                        handle(onRejected)
                    })
                } else {
                    //当前还是pending状态,保存回调函数,
                    self.callbacks.push({
                        onResolved() {
                            handle(onResolved)
                        },
                        onRejected() {
                            handle(onRejected)
                        }
                    })
                }
            })
        }
        /**原型上的catch*/
        Promise.prototype.catch = function (onRejected) {
            return this.then(undefined, onRejected)
    
        }
        /**函数对象的方法 resolve*/
        Promise.resolve = function (value) {
            //返回一个成功或者失败的promise
            return new Promise((resolve, reject) => {
                try {
                    //    3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                    if (value instanceof Promise) {
                        value.then(resolve, reject)
                    } else {
                        // 2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                        resolve(value)
                    }
                } catch (err) {
                    reject(err)
                }
            })
        }
        /**函数对象的方法 reject*/
        Promise.reject = function (reason) {
            return new Promise((resolve, reject) => {
                reject(reason)
            })
        }
        /**函数对象的方法 all*/
        Promise.all = function (promises) {
            let list = new Array(promises.length)
            let resolvedCount = 0
            return new Promise((resolve, reject) => {
                //遍历获取所有promise的结果
                promises.forEach((p, index) => {
                    Promise.resolve(p).then(
                        value => {
                            list[index] = value
                            resolvedCount++
                            //如果全部成功,将状态置为成功
                            if (resolvedCount === promises.length) {
                                resolve(list)
                            }
                        },
                        reason => {//只要有一个失败了,return的promise就失败了
                            reject(reason)
                        }
                    )
                })
            })
    
    
        }
        /**函数对象的方法 race*/
        Promise.race = function (promises) {
            let resolvedCount = 0
            return new Promise((resolve, reject) => {
                //遍历获取所有promise的结果
                promises.forEach((p, index) => {
                    Promise.resolve(p).then(
                        value => {
                            //如果有一个成功,将状态置为成功if (resolvedCount === promises.length) {
                            resolve(value)
                        },
                        reason => {//只要有一个失败了,return的promise就失败了
                            reject(reason)
                        }
                    )
                })
            })
        }
        /**自定义函数对象的方法 resolveDelay 返回一个函数在指定的时间后才确定结果*/
        Promise.resolveDelay = function (value,time=1000) {
    
            //返回一个成功或者失败的promise
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    try {
                        //    3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                        if (value instanceof Promise) {
                            value.then(resolve, reject)
                        } else {
                            // 2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                            resolve(value)
                        }
                    } catch (err) {
                        reject(err)
                    }
                }, time)
            })
        }
        /**自定义函数对象的方法 rejectDelay 返回一个函数在指定的时间后才失败*/
        Promise.rejectDelay = function (value,time=1000) {
            setTimeout(() => {
                return new Promise((resolve, reject) => {
                    reject(reason)
                })
            }, time)
    
        }
        window.Promise = Promise
    })(window)
    
    2、自定义Promise 类版本
    
    (function (window) {
        const PENDING = "pending"
        const RESOLVED = "resolved"
        const REJECTED = "rejected"
        class Promise {
            constructor(excutor) {
                //给promise对象指定status属性,初始值为pending
                this.status = PENDING
                //给promise对象指定一个用于存储结果数据的属性
                this.data = undefined;
                //每个元素的结构 {onResolved(){},onrejected(){}}
                this.callbacks = []
                let self = this;
                function resolve(value) {
                    //状态更改过以后不再执行
                    if (self.status !== PENDING) {
                        return
                    }
                    //更改状态
                    self.status = RESOLVED
                    //保存value数据
                    self.data = value
                    //如果有待执行cakkback函数,立即异步执行回调函数
                    if (self.callbacks.length > 0) {
                        setTimeout(() => {//放入队列中执行所有成功的回调
                            self.callbacks.forEach(callbacksObj => {
                                callbacksObj.onResolved(value)
                            });
                        })
    
                    }
                }
                function reject(reason) {
                    //状态更改过以后不再执行
                    if (self.status !== PENDING) {
                        return
                    }
                    //更改状态
                    self.status = REJECTED
                    //保存value数据
                    self.data = reason
                    //如果有待执行cakkback函数,立即异步执行回调函数
                    if (self.callbacks.length > 0) {
                        setTimeout(() => {//放入队列中执行所有失败的回调
                            self.callbacks.forEach(callbacksObj => {
                                callbacksObj.onRejected(reason)
                            });
                        })
    
                    }
                }
                try {
                    //立即同步执行excutor
                    excutor(resolve, reject)
                } catch (error) {//如果执行器抛出异常
                    reject(error)
                }
            }
            /**原型上的then*/
            then(onResolved, onRejected) {
                let self = this;
                onResolved = typeof onResolved === 'function' ? onResolved : value => value
                //实现异常穿透
                onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
    
                //返回一个新的promise对象
                return new Promise((resolve, reject) => {
                    //调用指定回调函数处理,根据执行结果,改变return的promise状态
                    function handle(fn) {
                        /**
                             1、如果执行抛出异常 return的promise就会失败,reason就是error
                             2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                             3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                            */
                        try {
                            let result = fn(self.data)
                            //    3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                            if (result instanceof Promise) {
                                result.then(resolve, reject)
                                //等价于
                                // result.then(
                                //     value => {resolve(value)},
                                //     reason => {reject(reason)}
                                // )
                            } else {
                                // 2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                                resolve(result)
                            }
                        } catch (err) {
                            reject(err)
                        }
                    }
                    //如果状态还没有被更改此时缓存回调函数
                    if (self.status === RESOLVED) {
                        //如果是状态已经更改过了,回调函数放入队列中,并改变promise的状态
                        setTimeout(() => {
                            handle(onResolved)
                        })
                    } else if (self.status === REJECTED) {//rejected
                        //如果是状态已经更改过了,回调函数放入队列中
                        setTimeout(() => {
                            handle(onRejected)
                        })
                    } else {
                        //当前还是pending状态,保存回调函数,
                        self.callbacks.push({
                            onResolved() {
                                handle(onResolved)
                            },
                            onRejected() {
                                handle(onRejected)
                            }
                        })
                    }
                })
            }
            /**原型上的catch*/
            catch(onRejected) {
                return this.then(undefined, onRejected)
    
            }
            /**函数对象的方法 resolve*/
            static resolve = function (value) {
                //返回一个成功或者失败的promise
                return new Promise((resolve, reject) => {
                    try {
                        //    3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                        if (value instanceof Promise) {
                            value.then(resolve, reject)
                        } else {
                            // 2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                            resolve(value)
                        }
                    } catch (err) {
                        reject(err)
                    }
                })
            }
            /**函数对象的方法 reject*/
            static reject = function (reason) {
                return new Promise((resolve, reject) => {
                    reject(reason)
                })
            }
            /**函数对象的方法 all*/
            static all = function (promises) {
                let list = new Array(promises.length)
                let resolvedCount = 0
                return new Promise((resolve, reject) => {
                    //遍历获取所有promise的结果
                    promises.forEach((p, index) => {
                        Promise.resolve(p).then(
                            value => {
                                list[index] = value
                                resolvedCount++
                                //如果全部成功,将状态置为成功
                                if (resolvedCount === promises.length) {
                                    resolve(list)
                                }
                            },
                            reason => {//只要有一个失败了,return的promise就失败了
                                reject(reason)
                            }
                        )
                    })
                })
    
    
            }
            /**函数对象的方法 race*/
            static race = function (promises) {
                let resolvedCount = 0
                return new Promise((resolve, reject) => {
                    //遍历获取所有promise的结果
                    promises.forEach((p, index) => {
                        Promise.resolve(p).then(
                            value => {
                                //如果有一个成功,将状态置为成功if (resolvedCount === promises.length) {
                                resolve(value)
                            },
                            reason => {//只要有一个失败了,return的promise就失败了
                                reject(reason)
                            }
                        )
                    })
                })
            }
            /**自定义函数对象的方法 resolveDelay 返回一个函数在指定的时间后才确定结果*/
            static resolveDelay = function (value, time = 1000) {
                //返回一个成功或者失败的promise
                return new Promise((resolve, reject) => {
                    setTimeout(() => {
                        try {
                            //    3、如果回调函数返回的是promise,return的promise结果就是这个promise 的结果
                            if (value instanceof Promise) {
                                value.then(resolve, reject)
                            } else {
                                // 2、如果回调函数不是promise,return的promise就会成功,value就是返回值
                                resolve(value)
                            }
                        } catch (err) {
                            reject(err)
                        }
                    }, time)
                })
            }
            /**自定义函数对象的方法 rejectDelay 返回一个函数在指定的时间后才失败*/
            static ejectDelay = function (value, time = 1000) {
                setTimeout(() => {
                    return new Promise((resolve, reject) => {
                        reject(reason)
                    })
                }, time)
    
            }
    
        }
        window.Promise = Promise
    })(window)
    

    相关文章

      网友评论

        本文标题:自定义promise

        本文链接:https://www.haomeiwen.com/subject/ucuaprtx.html