Use cases/Dependent HTTP chain — запрос зависит от ответа
Use cases · 24 練
Dependent HTTP chain — запрос зависит от ответа
Паттерн
Чтобы загрузить permissions, нужен user.id из первого запроса. Чтобы загрузить dashboard, нужен permission.scope из второго. Параллельно никак — последовательная цепочка.
Какую проблему решаем
Императивно это превращается в pyramid of subscribes: subscribe внутри subscribe внутри subscribe. Отмена при смене route разваливается — старая цепочка продолжает выполняться. Обработка ошибок размазана по всем уровням.
Операторы и зачем они нужны
switchMap — передаёт результат предыдущего запроса в следующий, и отменяет всю цепочку при новом верхнем триггере (например, смене id в URL).
map — собирает финальный ответ в нужный VM.
catchError — обрабатывает сбой ЛЮБОГО этапа цепочки в одном месте.
Подводные камни
mergeMap — при смене триггера (новый id в URL) старая цепочка продолжит работать параллельно новой. Хаос с ответами.
forkJoin здесь нельзя — второй запрос не знает свой параметр заранее, нужно сначала дождаться первого.
catchError в середине цепочки — поймаете ошибку и отправите следующий запрос с дефолтными значениями. Будет ехать поезд без рельс.
Что в итоге получаем
Зависимая загрузка превращается в один Observable с прозрачным контрактом success/error. Отмена работает атомарно на всю цепочку.