1. Promise上都有哪些方法
在正式写代码之前,我们需要先给promise可能用到的方法做一个分类:promise对象上的方法以及Promise上的方法。
从上图中可以看出,
定义在原型对象上的方法为:
- 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()的实现
- 首先这个方法直接定义在Promise上面
- 参数必须为数组,当参数不为数组时,给予错误提示
- 返回值是一个Promise对象
- 必须严格控制,只有数组中的全部promise的状态为resolved,才会返回值
- 当有其中一个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()中的参数顺序是严格对应的。
以上内容如果有什么问题,请大家指出哦~