问答题1181/1593实现 Promise.all

难度:
2021-07-06 创建

参考答案:

// 简易版

1Promise.myAll = function(promiseArr) { 2 return new Promise((resolve, reject) => { 3 const ans = []; 4 let index = 0; 5 for (let i = 0; i < promiseArr.length; i++) { 6 promiseArr[i] 7 .then(res => { 8 ans[i] = res; 9 index++; 10 if (index === promiseArr.length) { 11 resolve(ans); 12 } 13 }) 14 .catch(err => reject(err)); 15 } 16 }) 17}

// 终极版

1// 输入不仅仅只有Array 2function promiseAll (args) { 3 return new Promise((resolve, reject) => { 4 const promiseResults = []; 5 let iteratorIndex = 0; 6 // 已完成的数量,用于最终的返回,不能直接用完成数量作为iteratorIndex 7 // 输出顺序和完成顺序是两码事 8 let fullCount = 0; 9 // 用于迭代iterator数据 10 for (const item of args) { 11 // for of 遍历顺序,用于返回正确顺序的结果 12 // 因iterator用forEach遍历后的key和value一样,所以必须存一份for of的 iteratorIndex 13 let resultIndex = iteratorIndex; 14 iteratorIndex += 1; 15 // 包一层,以兼容非promise的情况 16 Promise.resolve(item).then(res => { 17 promiseResults[resultIndex] = res; 18 fullCount += 1; 19 // Iterator 接口的数据无法单纯的用length和size判断长度,不能局限于Array和 Map类型中 20 if (fullCount === iteratorIndex) { 21 resolve(promiseResults) 22 } 23 }).catch(err => { 24 reject(err) 25 }) 26 } 27 // 处理空 iterator 的情况 28 if(iteratorIndex===0){ 29 resolve(promiseResults) 30 } 31 } 32 ) 33} 34if (!Promise.all) Promise.all = promiseAll;

最近更新时间:2021-08-13

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!