Promise.all: один упавший вызов роняет весь ответ
Ручка профиля собирает данные из трёх внутренних сервисов:
const [profile, orders, bonuses] = await Promise.all([
profileApi.get(userId),
ordersApi.list(userId),
bonusApi.balance(userId),
]);
return { profile, orders, bonuses };
Сервис бонусов нестабилен и примерно в 1% случаев отвечает 500. В эти моменты пользователь видит полностью пустую страницу профиля, хотя профиль и заказы получены нормально. Что здесь происходит и как это чинить?
- `Promise.all` отклоняется на первой же ошибке, поэтому теряется весь результат; нужно `Promise.allSettled` и деградация только по блоку бонусов
- `Promise.all` выполняет вызовы последовательно, поэтому падение третьего отменяет первые два; нужно запускать их вручную и складывать результаты
- Достаточно обернуть весь блок в `try/catch`: тогда уже полученные ответы останутся доступны в переменных
- Нужно заменить `Promise.all` на цикл с `await`: тогда ошибка последнего вызова не повлияет на предыдущие
