ES2020包含Promise.allSettled,它将做你想做的事。
Promise.allSettled([
Promise.resolve('a'),
Promise.reject('b')
]).then(console.log)
输出:
[
{
"status": "fulfilled",
"value": "a"
},
{
"status": "rejected",
"reason": "b"
}
]
但是,如果你想“滚动你自己的”,那么你可以利用这样一个事实,即使用Promise#catch
意味着承诺可以解析(除非你从承诺链中抛出异常或手动拒绝),所以你不需要显式返回已解析的承诺。catch
因此,通过简单地处理错误,您可以实现所需的目标。catch
请注意,如果您希望错误在结果中可见,则必须决定显示这些错误的约定。
您可以使用 Array#map 将拒绝处理函数应用于集合中的每个 promise,并使用 Promise.all 等待所有 promise 完成。
例
以下应打印出来:
Elapsed Time Output
0 started...
1s foo completed
1s bar completed
2s bam errored
2s done [
"foo result",
"bar result",
{
"error": "bam"
}
]
async function foo() {
await new Promise((r)=>setTimeout(r,1000))
console.log('foo completed')
return 'foo result'
}
async function bar() {
await new Promise((r)=>setTimeout(r,1000))
console.log('bar completed')
return 'bar result'
}
async function bam() {
try {
await new Promise((_,reject)=>setTimeout(reject,2000))
} catch {
console.log('bam errored')
throw 'bam'
}
}
function handleRejection(p) {
return p.catch((error)=>({
error
}))
}
function waitForAll(...ps) {
console.log('started...')
return Promise.all(ps.map(handleRejection))
}
waitForAll(foo(), bar(), bam()).then(results=>console.log('done', results))
另请参见。