Promise手写实现(二)

128 阅读2分钟

手写js实现Promise各种方法。

Promise.resolve()

(有时需要将现有对象转为 Promise 对象,Promise.resolve方法也会起到这个作用。) 1.传参为一个 Promise, 则直接返回它。
2.传参为一个 thenable 对象,返回的 Promise 会跟随这个对象,采用它的最终状态作为自己的状态。
3.其他情况,直接返回以该值为成功状态的promise对象。

Promise.all()

  • 功能说明 如果参数中有一个Promise失败,那么Promise.all返回的promise对象失败。

  • 参数说明 (1)如果传入的可迭代对象为空,Promise.all 会同步地返回一个已完成(resolved)状态的promise。
    (2)传入的参数不一定是数组对象,可以是"遍历器"。
    (3)在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组。

  • 实现

// all实现
Promise.all = function (arr){
    let n = 0; //声明一个计算器,全部执行成功后再resolve
    let resolveValue = []; //存放结果的数组
    let len = arr.length;
    // 如果传入的参数是一个空的可迭代对象,直接进行resolve
    if (len === 0){
        resolve(resolveValue);
        return;
    }
    return new Promise(function(resolve,reject){
        for (let i=0;i<len;i++){
            //如果执行成功后,将结果添加到数组中,并且n++
            // 为什么不直接 promise[i].then, 因为promise[i]可能不是一个promise
            Promise.resolve(arr[i]).then(res=>{
                resolveValue.push(res);
                n++;
                //如果n为参数数组长度,证明全部执行成功,执行resolve()
                if(n === len){
                    resolve(resolveValue);
                }
            })
            .catch(err=>{
                reject(err);
            })
        }
    })
}

测试all方法

//测试all方法
let p1 = new Promise(function(resolve,reject){
    let x =0;
    setTimeout(function(){
        x++;
        if(x==1){
            resolve(x);
        }
    },1000)
});
let p2 = new Promise(function(resolve,reject){
    let x = 0;
    setTimeout(function(){
        x++;
        if(x==1){
            resolve(x);
        }
    },1000)
})
Promise.all([p1,p2]).then((res)=>{
    console.log(res)
})

Promise.race

  • 功能说明 Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
  • 参数说明 返回的是一个Promise值。
  • 代码实现
// race实现
Promise.race = function(arr){
    return new Promise((resolve,reject)=>{
        let len = arr.length;
        for (let i=0;i<len;i++){
            Promise.resolve(arr[i]).then(res=>{
                resolve(res);
            }).catch(err=>{
                reject(err);
            })
        }
    })
}

async和await如何简化Promise

作用:
1.简化Promise对象的使用:不用再使用then()来指定成功/失败的回调函数 以同步编码(没有回调函数了)方式实现异步流程。