Promise周边封装(all,race,finaly)

1. Promise.all

封装要点:

  1. 只有遍历的promise都成功返回,则返回,有一个就reject:
    可以根据resolve的次数判断,resArray[index]可以完成返回值的一一对应
  2. 不用返回数组的长度和promise数组的长度做比较的原因是有可能靠后的实例先返回,从而造成之前下标的数组值为空值的情况。
 static all(promiseArray) {
        let resArray = [];
        let idx = 0;
        return new myPromise((resolve,reject) => {
            promiseArray.map((promise,index) => {
                if(isPromise(x)) {
                    promise.then(res => {
                        format(res,index,resolve)
                    },reject)
                } else {
                    format(res,index,resolve)
                }
            })
        })
        function format(res,index,resolve) {
            resArray[index] = res;
            if(++idx === promiseArray.length) {
                resolve(resArray)
            }
        }
    }
   // 判断是否是Promise
   isPromise(x) {
        if((typeof x === 'object' &&  typeof x !== 'null') || typeof x === 'function') {
            let then = x.then
            if(typeof then === 'function') {
                return true
            } else {
                return false
            }
        } else {
            return false
        }
    }

2. Promise.finaly

特性:

  1. 只有当finaly内部返回错误的promise,则之后链式调用才可能会返回finaly的值
  2. 如果里面有setTimeout等,finaly之后的链式调用会延迟执行,但是返回的值除第一条的情况下,均返回finaly之前的调用结果

封装思路

  1. 和promise的状态无关,所以then之后的两个函数都要写
  2. 当callback返回rejected状态时,promise.resolve实例状态会变成rejected
 static finaly(callback) {
        return this.then((res) => {
            return Promise.resolve(callback()).then(() => res)
        },(err) => {
            return Promise.resolve(callback()).then((err2) => {
                throw err},(err3) => {
                    console.log(err3,'err3')
                })
        })
    }

3. Promise.race

特性: 返回最先返回的结果

  static race(promiseArray) {
        return new myPromise((resolve,reject) => {
            promiseArray.map((promise) => {
                if(isPromise(x)) {
                   promise.then(resolve,reject)
                } else {
                    resolve(promise)
                }
            })
        })
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值