手写Promise.all
首先先回顾一下Promise.all的语法。
Promise.all接收一个数组,返回一个Promise。
如果参数数组中所有的元素返回值都为成功,则.all返回一个成功状态的Promise,这个Promise的值为成功的状态值组成的数组。
如果参数数组中有元素返回失败状态,则.all返回失败状态,且值为第一个失败的元素的失败值。
手写思路:
首先先判断一下传入的参数是不是数组,不是的话进行错误提示或者返回。
然后获得每个元素的返回状态。要注意,如果元素不是Promise,其也被视为Promise,如果元素是Promise,则以该Promise的返回值为准。这个规律刚好符合Promise.resolve()方法。
因此resolve每个数组元素,如果产生reject,用catch获取,否则记录成功的状态值。
要注意,可能会有元素返回的是待定状态,因此最终是否返回成功,要根据成功状态值的个数确认。如果数组中Promise的返回值中有待定 和 成功,则返回待定状态,有 待定 成功 失败状态的情况下,返回第一个失败的状态。
手写代码如下:
Promise.all = function(paramsData){//如果参数不是数组,进行返回if( ! Array.isArray(paramsData) ){return ;}//记录成功的状态个数let resolvedCount = 0;//记录成功的状态值let resultData = [];//遍历数组,并处理结果return new Promise((resolve, reject)=>{for(let data of paramsData){//获得当前元素的PromisePromise.resolve(data).then(//处理resolve状态(resolveData)=>{resultData[resolvedCount++] = resolveDataif(resolvedCount == paramsData.length){resolve(resultData);}}, ).catch((e) => {reject(e);})}})}