Promise(六)手写Promise(主体框架)

本文详细解析了Promise对象的创建、调用过程以及内部结构,重点介绍了状态转换、数据存储和异步回调的执行机制。通过实例展示了如何使用then和catch方法处理成功和失败情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Promise整体结构

调用部分:

    <script src="./promise.js"></script>
    <script>
        const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(1) //代表value
                    // reject(2) //代表reason
                    // console.log('reject改变状态之后')
            })

        })
        p.then(
            value => {
                console.log('onResolved1()', value)
            },
            reason => {
                console.log('onRejected1()', reason)
            }
        )
        p.then(
            value => {
                console.log('onResolved2()', value)
            },
            reason => {
                console.log('onRejected2()', reason)
            }
        )
    </script>

Promise部分:

//自定义Promise模块
//匿名函数自调用
(function(parms) {
    const PENDING = 'pending'
    const RESOLVED = 'resolved'
    const REJECTED = 'rejected'

    function Promise(excutor) {
        const self = this //将当前promise对象保存起来
        self.status = PENDING //给promise指定status属性,初始值为PENDING
        self.data = undefined //给promise对象指定一个用于存储结果数据的属性、
        self.callbacks = [] //每个元素的结构:{onRESOLVED(){},onREJECTED(){} {}}
            //excutor 执行器函数
        function resolve(value) {
            //如果当前状态不是PENDING,直接结束
            if (self.status != PENDING) {
                return
            }
            //将状态改为RESOLVED
            self.status = RESOLVED;
            //保存value数据
            self.data = value
                //如果有待执行callback函数,立即执行异步回调函数onRESOLVED
            if (self.callbacks.length > 0) {
                setTimeout(() => { //模拟放到队列里执行所有成功后的回调
                    self.callbacks.forEach(callbacksObj => {
                        callbacksObj.onResolved(value)
                    });
                })
            }
        }

        function reject(reason) {
            //如果当前状态不是PENDING,直接结束
            if (self.status != PENDING) {
                return
            }
            //将状态改为REJECTED
            self.status = REJECTED;
            //保存value数据
            self.data = reason
                //如果有待执行callback函数,立即执行异步回调函数onREJECTED
            if (self.callbacks.length > 0) {
                setTimeout(() => { //模拟放到队列里执行所有成功后的回调
                    self.callbacks.forEach(callbacksObj => {
                        callbacksObj.onRejected(reason)
                    });
                })
            }
        }

        //立即执行执行器函数excutor
        //如果执行器抛出异常,promise变为失败
        try {
            excutor(resolve, reject)
        } catch (error) {
            reject(error)
        }
    }
    //Promise的then方法
    //向外暴露Promise函数

    //Promise函数对象then
    //指定成功的函数
    //返回一个新的Promise对象
    Promise.prototype.then = function(onResolved, onRejected) {
        const self = this
            //指定回调函数的默认值(必须是函数)
        onResolved = typeof onResolved === 'function' ? onResolved : value => value
        onRejected = typeof onRejected === 'function' ? onRejected : reason => reason

        return new Promise((resolve, reject) => {
            function handle(callback) {
                // 执行指定的回调函数
                //根据执行的结果改变return的promise状态
                // 返回promise的结果有onResolved,onRejected执行结果决定
                // 1.抛出异常,返回promise的结果为失败,reason为异常
                try {
                    const result = onResolved(self.data)
                    if (result instanceof Promise) {
                        // result.then(
                        //     value=>resolve(value),
                        //     reason=>reject(reason)
                        //     )
                        result.then(resolve, reject)
                    } else {
                        resolve(result)
                    }
                } catch (error) {
                    reject(error)
                }
            }


            //当前promise状态是resolve
            //当前promise状态是reject
            //当前promise状态是pending
            if (self.status === RESOLVED) {
                setTimeout(() => {
                    handle(onResolved)
                })
            } else if (self.status === REJECTED) {
                setTimeout(() => {
                    handle(onRejected)
                })
            } else { //当前promise的状态是pending
                //将成功和失败的回调函数保存callbacks容器中缓存起来
                self.callbacks.push({
                    onResolved() {
                        handle(onResolved)
                    },
                    onRejected() {
                        handle(onRejected)
                    }
                })
            }

        })
    }

    //Promise函数对象catch
    //指定失败的函数
    //返回一个新的Promise对象
    Promise.prototype.catch = function(onReject) {
        return this.then(undefined, onRejected)
    }

    //Promise函数对象resolve
    //返回一个指定结果成功的Promise
    Promise.resolve = function(value) {

        }
        //Promise函数对象reject
        //返回一个指定结果失败的Promise
    Promise.reject = function(reason) {

        }
        //Promise的all方法
        //返回一个Promise,只有当所有的Promise都成功才成功,否则只要有一个失败的就是失败
    Promise.all = function(promises) {
            const valuse = new Array(promises.length); //用来保存所有成功value的数组
            const cont = 0; //用来保存成功的次数
            return new Promise((resolve, reject) => {
                //遍历获取每一个promise的结果
                promises.forEach((p, index) => {
                    Promise.resolve(p).then(
                        value => {
                            cont++
                            valuse[index] = value
                                //如果全部成功,将return的promise返回成功
                            if (cont == promises.length) {
                                resolve(values)
                            }
                        },
                        reason => { //只要有一个失败直接返回失败
                            reject(reason)
                        }
                    )
                })

            })

        }
        //Promise的race方法
        //返回一个Promise,其结果由第一个完成的Promise结果决定
    Promise.race = function(promises) {
        return new Promise((resolve, reject) => {
            //遍历获取每一个promise的结果
            promises.forEach((p, index) => {
                Promise.resolve(p).then(
                    value => { //一旦有成功了将return的promise变为成功
                        resolve(value)
                    },
                    reason => { //只要有一个失败直接返回失败
                        reject(reason)
                    }
                )
            })
        })
    }


    window.Promise = Promise
})(window)

类的Promise写法:

//自定义Promise模块
//匿名函数自调用
(function(parms) {
    const PENDING = 'pending'
    const RESOLVED = 'resolved'
    const REJECTED = 'rejected'

    class Promise {
        constructor(excutor) {
            const self = this //将当前promise对象保存起来
            self.status = PENDING //给promise指定status属性,初始值为PENDING
            self.data = undefined //给promise对象指定一个用于存储结果数据的属性、
            self.callbacks = [] //每个元素的结构:{onRESOLVED(){},onREJECTED(){} {}}
                //excutor 执行器函数
            function resolve(value) {
                //如果当前状态不是PENDING,直接结束
                if (self.status != PENDING) {
                    return
                }
                //将状态改为RESOLVED
                self.status = RESOLVED;
                //保存value数据
                self.data = value
                    //如果有待执行callback函数,立即执行异步回调函数onRESOLVED
                if (self.callbacks.length > 0) {
                    setTimeout(() => { //模拟放到队列里执行所有成功后的回调
                        self.callbacks.forEach(callbacksObj => {
                            callbacksObj.onResolved(value)
                        });
                    })
                }
            }

            function reject(reason) {
                //如果当前状态不是PENDING,直接结束
                if (self.status != PENDING) {
                    return
                }
                //将状态改为REJECTED
                self.status = REJECTED;
                //保存value数据
                self.data = reason
                    //如果有待执行callback函数,立即执行异步回调函数onREJECTED
                if (self.callbacks.length > 0) {
                    setTimeout(() => { //模拟放到队列里执行所有成功后的回调
                        self.callbacks.forEach(callbacksObj => {
                            callbacksObj.onRejected(reason)
                        });
                    })
                }
            }

            //立即执行执行器函数excutor
            //如果执行器抛出异常,promise变为失败
            try {
                excutor(resolve, reject)
            } catch (error) {
                reject(error)
            }
        }

        //Promise的then方法
        //向外暴露Promise函数

        //Promise函数对象then
        //指定成功的函数
        //返回一个新的Promise对象
        then(onResolved, onRejected) {
            const self = this
                //指定回调函数的默认值(必须是函数)
            onResolved = typeof onResolved === 'function' ? onResolved : value => value
            onRejected = typeof onRejected === 'function' ? onRejected : reason => reason

            return new Promise((resolve, reject) => {
                function handle(callback) {
                    // 执行指定的回调函数
                    //根据执行的结果改变return的promise状态
                    // 返回promise的结果有onResolved,onRejected执行结果决定
                    // 1.抛出异常,返回promise的结果为失败,reason为异常
                    try {
                        const result = onResolved(self.data)
                        if (result instanceof Promise) {
                            // result.then(
                            //     value=>resolve(value),
                            //     reason=>reject(reason)
                            //     )
                            result.then(resolve, reject)
                        } else {
                            resolve(result)
                        }
                    } catch (error) {
                        reject(error)
                    }
                }


                //当前promise状态是resolve
                //当前promise状态是reject
                //当前promise状态是pending
                if (self.status === RESOLVED) {
                    setTimeout(() => {
                        handle(onResolved)
                    })
                } else if (self.status === REJECTED) {
                    setTimeout(() => {
                        handle(onRejected)
                    })
                } else { //当前promise的状态是pending
                    //将成功和失败的回调函数保存callbacks容器中缓存起来
                    self.callbacks.push({
                        onResolved() {
                            handle(onResolved)
                        },
                        onRejected() {
                            handle(onRejected)
                        }
                    })
                }

            })
        }

        //Promise函数对象catch
        //指定失败的函数
        //返回一个新的Promise对象
        catch (onReject) {
            return this.then(undefined, onReject)
        }

        //Promise函数对象resolve
        //返回一个指定结果成功的Promise
        static resolve(value) {
                //返回一个成功/失败的promise
                return new Promise((resolve, reject) => {
                    if (value instanceof Promise) { //使用value的结果
                        value.then(resolve, reject)
                    } else { //value不是promise 
                        resolve(value)
                    }
                })
            }
            //Promise函数对象reject
            //返回一个指定结果失败的Promise
        static reject(reason) {
                return new Promise((resolve, reject) => {
                    reject(reason)
                    self.status = REJECTED
                })
            }
            //Promise的all方法
            //返回一个Promise,只有当所有的Promise都成功才成功,否则只要有一个失败的就是失败
        static all(promises) {
                const valuse = new Array(promises.length); //用来保存所有成功value的数组
                const cont = 0; //用来保存成功的次数
                return new Promise((resolve, reject) => {
                    //遍历获取每一个promise的结果
                    promises.forEach((p, index) => {
                        Promise.resolve(p).then(
                            value => {
                                cont++
                                valuse[index] = value
                                    //如果全部成功,将return的promise返回成功
                                if (cont == promises.length) {
                                    resolve(values)
                                }
                            },
                            reason => { //只要有一个失败直接返回失败
                                reject(reason)
                            }
                        )
                    })

                })

            }
            //Promise的race方法
            //返回一个Promise,其结果由第一个完成的Promise结果决定
        static race(promises) {
            return new Promise((resolve, reject) => {
                //遍历获取每一个promise的结果
                promises.forEach((p, index) => {
                    Promise.resolve(p).then(
                        value => { //一旦有成功了将return的promise变为成功
                            resolve(value)
                        },
                        reason => { //只要有一个失败直接返回失败
                            reject(reason)
                        }
                    )
                })
            })
        }

        // 返回一个promise对象,它在指定的时间后才确定结果
        static resolveDelay(value, time) {
            setTimeout(() => {
                return new Promise((resolve, reject) => {
                    reject(reason)
                    self.status = REJECTED
                })
            }, time)

        }

        // 返回一个promise对象,它在指定的时间后才失败
        static rejectDelay(value, time) {
            setTimeout(() => {
                return new Promise((resolve, reject) => {
                    reject(reason)
                })
            }, time)

        }
    }



    window.Promise = Promise
})(window)

主要部分:
1.首先为Promise对象准备三个属性。
(1)status(Promise对象的状态)、
(2)data(Promise对象的数据)、
(3)callbacks(缓存Promise对象的回调函数)
2.调用执行器函数(excutor),执行器函数调用之前,需要准备两个函数(内部定义好),由外部使用者调用。执行器调用之前要对执行器函数进行异常检测,如果执行器函数异常。则调用reject函数
(1)resolve()
(2)reject()
3.实现resolve()和reject(),先要判断当前的状态,只有resolve和reject才可以进行回调函数的调用。注意,成功和失败的回调函数是异步的,常规都是先指定了回调函数,但是也可以先改变状态,在指定回调函数的(详细可查看我的前几篇文章),所以此处加了缓存回调函数数组的判断。
(1)改变状态
(2)保存数据
(3)异步执行,待执行的回调函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

画不完的饼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值