手撕代码-Promise.all

1. Promise上都有哪些方法

在正式写代码之前,我们需要先给promise可能用到的方法做一个分类:promise对象上的方法以及Promise上的方法。

image.png 从上图中可以看出, 定义在原型对象上的方法为:

  • catch
  • then
  • finally 定义在构造函数中的方法为:
  • all
  • race
  • reject
  • resolve 对于构造函数上的方法,可以直接通过Promise.all()进行调用,但是定义在原型上面的对象,需要通过(new Promise(()=>{})).then()进行调用。

2.Promise.all的作用

对于Promise.all()主要是用来做并行处理,当同时存在多个Promise对象时,我们可以放入all中进行处理,all只有传入的所有的promise对象都为resolved状态时,才会返回结果;否则进行错误结果处理。

参数 由于需要处理多个promise,所以参数是promise数组 返回值 Promise.all()调用之后,会按照顺序数组参数的顺序返回结果,返回值是一个promise对象。

3.Promise.all()的实现

  1. 首先这个方法直接定义在Promise上面
  2. 参数必须为数组,当参数不为数组时,给予错误提示
  3. 返回值是一个Promise对象
  4. 必须严格控制,只有数组中的全部promise的状态为resolved,才会返回值
  5. 当有其中一个Promise对象的状态为rejected,立马返回,不再执行
    Promise.myAll=function(promises){
        return new Promise((resolve,reject)=>{
            if(!Array.isArray(promises)){
                    throw new Error("参数必须是数组");
            }
            let resolvedCount=0;
            let promiseLength=promises.length;
            let resolvedResult=[];
            for(let i=0;i<promises.length;i++){
                    Promise.resolve(promises[i]).then((value)=>{
                            resolvedCount++;
                            resolvedResult[i]=value;
                            if(resolvedCount===promiseLength){
                                    return resolve(resolvedResult);
                            }
                    },error=>{
                            reject(error);
                    })
            }
        })
    }

以上代码需要做说明的地方是: resolvedResult[i]=value;,使用索引进行数组数据的添加,由于是异步任务,所以并不能保证异步执行返回的顺序。所以我们需要通过索引去保证最终的返回结果与Promise.all()中的参数顺序是严格对应的。

以上内容如果有什么问题,请大家指出哦~