Promise.all()
是 JavaScript 中的一个内置方法,它接受一个 Promise
可迭代对象,并返回一个新的 Promise
。这个新 Promise 仅在可迭代对象中的所有 Promise
都已成功时才会被满足,或者在可迭代对象中的任何 Promise 被拒绝时立即被拒绝。Promise.all()
的 Promise
的值是可迭代对象中已满足的 Promise 的值的数组,按照可迭代对象中 Promise
的顺序排列。
-
从
promiseAll
函数返回一个新Promise
。 -
如果输入数组为空,立即用一个空数组解析它并返回。
-
初始化一个数组
res
以保存结果,最初填充为null
。 -
初始化一个
resolvedCount
变量,用于跟踪已解析的Promise
数。 -
迭代 Promise 返回函数的数组。对于每个返回
Promise
的函数:- 在
async/await
版本中,等待 Promise。在解析时,将结果放入res
数组中的相应位置并增加resolvedCount
。如果引发错误,立即用错误拒绝Promise
。 - 在
then/catch
版本中,附加一个then
子句和一个catch
子句。在解析时,then
子句将结果放入res
数组中并增加resolvedCount
。catch
子句用错误拒绝Promise
。
- 在
async/await 写法
const promiseAll = function(functions) {
return new Promise(function(resolve, reject) {
if (functions.length === 0) {
return resolve([])
}
const res = new Array(functions.length).fill(null)
let resolvedCount = 0
functions.forEach(async function(el,index) {
try{
res[index] = await el()
resolvedCount++
if (resolvedCount === functions.length) {
resolve(res)
}
} catch (error) {
reject(error)
}
})
})
}
then/catch 写法
const promiseAll = function (functions) {
return new Promise((resolve, reject) => {
if (functions.length === 0) {
return resolve([])
}
const res = new Array(functions.length).fill(null)
let resolvedCount = 0
functions.forEach((el,index) => {
el().then((itemResult) => {
res[index] = itemResult
resolvedCount++
if (resolvedCount === functions.length) {
resolve(res)
}
}).catch((err) => {
return reject(err)
})
})
})
}