promise源码深度解析

//promise的封装
        class myPromise {
            constructor(fn) {
                if (typeof fn !== 'function') { //判断传输的类型不是函数 报相应的错误
                    throw TypeError(`myPromise resolver ${fn} is not a function`)
                }
                this.status = 'pending'; //设置默认状态
                this.data = undefined; //设置默认值
                this.resolveCBArr = []; // 设置存储成功的回调函数
                this.rejectCBArr = []; // 设置存储失败的回调函数
                // 函数内部的resolve函数
                let resolve = (data) => { //成功的回调
                    if (this.status == 'pending') {
                        this.status = 'resolved'
                        this.data = data;
                        this.resolveCBArr.forEach(fn => fn()); //遍历resolveArr数组每一位 然后依次执行
                    }
                }
                // 函数内部的reject函数
                let reject = (data) => { //失败的回调
                    if (this.status == 'pending') {
                        this.status = 'rejected'
                        this.data = data;
                        this.rejectCBArr.forEach(fn => fn()); //遍历rejectArr数组每一位 然后依次执行
                    }
                }
                fn(resolve, reject) //挂载到new myPromise((resolve,reject) => {})
            }
            //原型then方法的封装
            then(resolveFn, rejectFn) {
                if (this.status == 'resolved') { //成功的回调的结果
                    //为了模仿promise对象中 then方法内的方法是异步的 利用setTimeout
                    setTimeout(() => {
                        let res = resolveFn(this.data) // 接受返回值的结果是promise 还是 值
                        if (res instanceof myPromise) { // 判断返回的值是否为promise构造出来的
                            return res; //如果是 直接返回
                        } else {
                            return myPromise.resolve(res) // 如果不是 返回resolve状态的值
                        }
                    }, 0)
                }
                if (this.status == 'rejected') { //失败的回调的结果
                    //为了模仿promise对象中 then方法内的方法是异步的 利用setTimeout
                    setTimeout(() => {
                        let res = rejectFn(this.data) // 接受返回值的结果是promise 还是 值
                        if (res instanceof myPromise) { // 判断返回的值是否为promise构造出来的
                            return res; //如果是 直接返回
                        } else {
                            return myPromise.resolve(res) // 如果不是 返回resolve状态的值
                        }
                    }, 0)
                }
                if (this.status == 'pending') { //执行异步的回调函数 如 setTimeout
                    return new myPromise((resolve, reject) => { //首先肯定返回promise对象
                        //利用立即执行函数的特性 将每一个异步成功的回调插入数组中
                        this.resolveCBArr.push(((resolveFn) => {
                            //return出去一个函数,为了将里面的结果映射给 this.resolveCB
                            return () => {
                                let res = resolveFn(this.data);// 接受返回值的结果是promise 还是值
                                if (res instanceof myPromise) { // 判断返回的值是否为promise构造出来的
                                    res.then(resolve, reject) //如果是promise 调用then方法 执行resolve 将状态映射给new myPromise 返回相应的回调
                                } else {
                                    resolve(res) //如果不是 返回resolve状态的值
                                }
                            }
                        })(resolveFn))
                        //利用立即执行函数的特性 将每一个异步失败的回调插入数组中
                        this.rejectCBArr.push(((rejectFn) => {
                            //return出去一个函数,为了将里面的结果映射给 this.rejectCB
                            return () => {
                                let res = rejectFn(this.data);// 接受返回值的结果是promise 还是值
                                if (res instanceof myPromise) { // 判断返回的值是否为promise构造出来的
                                    res.then(resolve, reject) //如果是promise 调用then方法 执行reject 将状态映射给new myPromise 返回相应的回调
                                } else {
                                    resolve(res) //如果不是 返回resolve状态的值
                                }
                            }
                        })(rejectFn))
                    })
                }
            }
            static resolve(data) { //上面的静态方法 myPromise.resolve()
                return new myPromise(reslove => reslove(data)) //执行封装好的resolve
            }
            static reject(data) { //上面的静态方法 myPromise.reject()
                return new myPromise((resolve, reject) => reject(data)) //执行封装好的reject
            }
            static all(dataArr){ //上面的静态方法 myPromise.all()
      return new myPromise(resolve => {
          resolve(dataArr) //将传来的数组添加到data中
      })
    }
    }
--------------------------------------------------------------------------------------------------------------------- 

 总结:

promise的封装分为 promise内部的一些方法 如 reslove reject 通过判断状态来

决定执行哪个函数 以及传输值可以将值也输出 第二部分是原型上面的then方法 then方法

也同样里面是两个回调函数 分别是成功和失败执行的函数 也是通过 内部方法的状态来决定

里面需要判断的一点是 return出去的值是 promise对象还是 其他类型的值 如果是promise

对象下一次调用then方法,是由上一次的return出去的状态来决定是成功还是失败,如果不是

 promise对象的话 可以直接返回相应的值 第三部分为promise上面静态的方法 如Promise.resolve()

这些方法也可以直接调用 直接返回一个带有状态的promise对象就可以了,最后一点也是最难

理解的一点 就是异步的操作 当promise函数的内部调用 setTimeout 状态为pending 我们

需要特殊的处理一下 保证then方法内可以依旧执行 我们需要用一个数组来接收变化的值,然后

配合我们的立即执行函数来return一个新的函数 将改变之后的状态映射给 Promise对象 ,最后的

最后 为了模拟then方法的异步 我们可以将resolve reject函数内部添加setTimeout 从而使then

方法内部的函数有一种异步的感觉

转载于:https://www.cnblogs.com/2030xx/p/9835576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值