它接受一个Promise对象组成的数组
。返回一个新的Promise
,只有所有的Promise都成功才成功,只要有一个失败了就直接失败。成功的结果是每个Promise成功结果组成的数组
,失败的结果是Promise数组中失败的结果
。
function pAll (_promises) { return new Promise((resolve, reject) => { // Iterable => Array const promises = Array.from(_promises) // 结果用一个数组维护 const res = [] const len = promises.length let count = 0 for (let i = 0; i < len; i++) { // Promise.resolve 确保把所有数据都转化为 Promise Promise.resolve(promises[i]).then(result=> { // 因为 promise 是异步的,保持数组一一对应 // 如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。 res[i] = result; // 如果数组中所有 promise 都完成,则返回结果数组 if (++count === len) { resolve(res) } // 当发生异常时,直接 reject }).catch(err => reject(err)) } }) }
其中有几个点:
Array.from()
方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。Promise.resolve
确保把所有数据都转化为 Promise,如果参数是 Promise 实例
,那么Promise.resolve将不做任何修改、原封不动地返回这个实例
。参考:https://github.com/shfshanyue/Daily-Question/issues/500