Use cases/Per-item error isolation — один fail не ломает batch
Use cases · 62 反
Per-item error isolation — один fail не ломает batch
Паттерн
Загружаем 4 файла. Один (bad.png) упал — но это НЕ должно отменить загрузку остальных трёх. Каждый item должен жить и падать независимо. Размещение catchError имеет критическое значение.
Какую проблему решаем
Promise.all отклоняется на первой ошибке — успешные результаты потеряются. Та же логика в RxJS: catchError СНАРУЖИ mergeMap остановит весь batch. Нужно поставить его ВНУТРИ обработки каждого item.
Операторы и зачем они нужны
mergeMap(file => upload(file)) — запускаем upload для каждого file параллельно.
catchError(...) ВНУТРИ inner pipeline — ловит ошибку только этого конкретного item.
of(failedResult) — превращаем ошибку в data: {file, status: 'failed', reason}.
Подводные камни
catchError СНАРУЖИ mergeMap — batch остановится на первом failed item. Это самая частая ошибка.
concatMap даст последовательный порядок, но всё в очередь — медленно. Выбирайте по UX.
Не скрывайте item error от UI. Пользователь должен видеть «файл X не загрузился», иначе будет думать, что всё ок.
Что в итоге получаем
Batch продолжает работу, упавший item становится частью результата (data, а не падение).