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))
 
 
另请参见。