美文网首页前端
自定义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

  • [iOS][OC] 看 BRYSerialAnimationQu

    背景 上文 《自定义 Promise 处理串行的异步操作》 分析了串行的异步操作的自定义 Promise 处理。P...

  • 宏观看Promise

    自定义Promise实现,来了解他的运行原理

  • 【React】JS异步执行工具 Promise

    使用Promise 实现刷新页面、业务代码的先后执行 自定义封装(方便调用) 自定义调用

  • 手写Promise(自定义Promise)

    首先我们得先理解Promise工作的机制,其实Promise就是一个构造函数 它的内部有三个状态: pending...

  • 手写Promise

    今天来玩一下Promise,一步步分析。 原版Promise效果 自定义一个Pomise 执行结果执行结果 此时看...

  • 手写promise之分步解析

    promise是es6推出适用于异步请求的构造函数,帮助解决回调地狱的问题,以下内容将自定义实现promise,只...

  • 自定义Promise

    Promise是什么 Promise是异步编程的一种解决方案。具体表达:语法上来说,Promise是一个构造函数功...

  • 自定义promise

    promise的详细介绍[https://blog.csdn.net/weixin_44972008/articl...

  • JavaScript 自定义 Promise

    使用 Promise源代码 参考文章: Promise的封装

网友评论

    本文标题:自定义promise

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