Мой подход:
const promise1 = Promise.resolve(1)
const promise2 = Promise.reject(2)
const errors = []
Promise.all([
promise1,
promise2
].map((promise) => promise.catch((error) => {
errors.push(error)
}))).then(([response1, response2]) => {
console.log(response1)
// 1
console.log(response2)
// undefined
console.log(errors)
// [2]
})
У него есть свои недостатки, но в целом он может быть эффективным. Я склонен использовать этот шаблон, когда меня не волнуют причины ошибок.