《Promise学习笔记》- 4Promise自定义封装之静态属性resolve、reject、all、race方法封装

接着封装四个原型对象自身的方法,分别是resolve、reject、all、race方法。注意这些方法不可以被实例对象p所调用,也就是不能通过p.xxx()调用,只能通过Promise.xxx()调用!

Promise.resolve()

该方法接收一个参数,这个参数可以是非Promise类型的也可以是Promise类型的,而返回结果一定是一个Promise对象,返回对象的状态和状态值由传入的参数决定,具体遵循以下规则:

  • 如果传入Promise类型的参数,那么所返回对象的状态和状态值有这个参数的状态所决定;
  • 如果传入的是非Promise类型的参数,那么所返回对象的状态一定是成功的,且状态值就是传入的参数。
// Promise.resolve()方法
static resolve(value){
    return new Promise((resolve,reject)=>{
        if(value instanceof Promise){
            value.then(v => {
                resolve(v);
            },r => {
                reject(r);
            })
        }else{
            resolve(value);
        }
    })
}

代码解释:需要先判断传入的参数value是否是Promise类型的参数。如果是Promise类型的参数,那么该参数一定可以执行then回调,如果参数状态为成功时,执行对应的成功的回调,并能够将成功的状态值保存在v中,则可以在回调中调用resolve函数修改所返回Promise对象的状态为成功,并将参数成功的状态值v传入resolve中作为返回对象成功的状态值!如果是非Promise类型的数据,则所返回的Promise对象状态一定是成功的,状态值就是传入的value。

Promise.reject()

该方法接收一个参数,这个参数可以是非Promise类型的也可以是Promise类型的,而返回结果一定是一个Promise对象,并且值得注意的是,此时无论传入什么类型的参数,返回的对象都是失败,并且状态值是传入Promise参数的状态值或非Promise类型的参数值。

// Promise.reject()方法
static reject(reason){
    return new Promise((resolve,reject)=>{
        reject(reason)
    })
}

Promise.all()

该方法接收的参数为一个由若干Promise对象组成的数组,并且返回结果也是一个Promise对象,若数组中每个Promise的状态都成功,那么返回结果对象的状态也是成功,状态值为每个Promise状态值组成的数组;一旦数组中某个Promise状态为失败,那么返回结果对象的状态也是失败,并且状态值为数组中最先失败的Promise的状态值。

static all(promises){
    return new Promise((resolve,reject)=>{
        // 记录数组中成功状态Promise的个数
        let count = 0;
        // 保存成功的状态值
        let arr = [];
        for(let i=0;i<promises.length;i++){
            promises[i].then(v => {
                count++;
                arr[i]=v;
                // 如果成功的个数等于数组长度,则说明每个都成功
                if(count === promises.length){
                    resolve(arr);
                }
            },r => {
                reject(r);
            })
        };
    })
}

Promise.race()

该方法接收的参数也是一个有若干Promise对象组成的数组,返回一个Promise对象,该返回对象的状态由数组中第一个状态改变的Promise的状态所决定,若第一个状态变为成功,则返回对象的状态也是成功,并且状态值是对应成功的状态值;失败的场景也是一样的!

static race(promises){
    return new Promise((resolve,reject)=>{
        for(let i=0;i<promises.length;i++){
            promises[i].then(v => {
                resolve(v);
            },r => {
                reject(r);
            })
        }
    })
}
posted @ 2021-06-03 16:16  仙贝wang  阅读(377)  评论(0)    收藏  举报