BACK
Use casesPer-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, а не падение).

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...