Promise.all()Promise.all()方法用于将多个Promise实例包装成一个新的Promise实例。Promise.all()方法接受一个数组作为参数。如果数组中有不是promise实例的东西,它会先调用下面提到的Promise.resolve方法将参数转化为Promise实例,然后再做进一步的处理。Promise.all()方法的参数可以不是数组,但必须有Iterator接口,返回的每个成员都是一个Promise实例。Promise.all()的返回值也是一个promise对象。当所有状态都变为fulfilled时,返回值的状态将变为fulfilled。当一个promise实例的状态变为rejected时,此时第一个被rejected的实例的返回值会传递给返回值的回调函数。实现过程中,定义一个执行结果数组,遍历all()参数,如果是普通值,直接进入结果数组,如果是promise实例,先执行,因为for循环有这样的特点立即执行,而我们的promise实例有可能存在异步代码,当执行结果向下传递时,我们必须保证我们所有的实例都被执行。在传递结果之前,需要判断是否所有的例子代码都执行完了。静态所有(数组){让??结果=[];//用于判断当前执行值是否等于数组长度,相等时才执行resolve()letidx=0;returnnewMyPromise((resolve,reject)=>{//添加元素方法functionaddElement(index,value){result[index]=value;idx++;if(idx===array.length){resolve(result)}}for(leti=0;iaddElement(i,value),reason=>reject(reason))}else{//纯值addElement(i,array[i]);}}})}promise.race()race()方法类似且更简单。它遍历传入的参数(数组对象)。如果它是一个普通值,它将是调用resolve()回调。如果是promise实例,执行then方法staticrace(array){returnnewMyPromise((resolve,reject)=>{for(leti=0;iresolve(e))}}Promise.prototype.finally()finally()方法用于指定无论Promise对象的最终状态如何都将执行的操作。该方法由ES2018引入标准。finally方法的回调函数不接受任何参数,不依赖于Promise的执行结果。执行函数体中的then方法会返回一个promise对象,成功回调或者失败回调都可以执行回调,返回成功回调结果或者抛出失败异常,但是考虑到异步代码的情况,用resolve()方法的帮助,在resolve方法中将回调调用的结果传递出去,无论是普通值还是promise,都被转换成promise对象。之后就可以执行then方法了。finally(callback){returnthis.then(value=>{returnMyPromise.resolve(callback()).then(()=>value);},reason=>{returnMyPromise.resolve(callback()).then(()=>{throwreason})})}Promise.prototype.catch()Promise.prototype.catch()方法是.then(null,rejection)或.then(undefined,rejection)的别名来指定发生错误时的回调函数。then()方法指定的回调函数,如果在运行过??程中抛出错误,也会被catch()方法捕获。Promise错误具有“冒泡”的性质,并且会向后传播直到被捕获。也就是说,错误总是会被下一个catch语句捕获。不同于传统的try/catch代码块,如果不使用catch()方法指定错误处理回调函数,Promise对象抛出的错误将不会传递给外层代码,即不会有回复。执行catch方法中的then方法,传入null或undefined作为第一个参数。第二个参数是failCallbackcatch(failCallback){this.then(undefined,failCallback)}