У меня есть следующий код:
event.afterClosed()
.pipe((filter(Boolean),
concatMap(() => this.applicationSubjectsService.get(this.id),
concatMap(() => this.applicationThemesService.get(this.id)
)))
Я бы выполнил два запроса последовательности. Как получить результат от каждого и добавить в локальную переменную?
Я пробовал это:
event.afterClosed()
.pipe((filter(Boolean),
concatMap(() => this.applicationSubjectsService.get(this.id), finilize((response) => this.localSubjects = response),
concatMap(() => this.applicationThemesService.get(this.id),
finilize((response) => this.localThemes = response),
)))
Как это сделать правильно и что нужно изменить, если нужно выполнить хотя бы один запрос?
Вы должны иметь возможность использовать оператор tap для подключения к результату из switchMap. Про тап-оператора можно прочитать здесь: тап
event.afterClosed()
.pipe((filter(Boolean),
concatMap(() => this.applicationSubjectsService.get(this.id)),
tap((result) => this.localSubjects = result),
concatMap(() => this.applicationThemesService.get(this.id)),
tap((result) => this.localThemes = result))
)
Если первый запрос завершится неудачно, цепочка будет удалена, и tap()
не будет запущено.
использование оператора tap на concatMap, на мой взгляд, является лучшим подходом (внутренняя труба)
Могу ли я использовать новую трубу для каждого concatMap
?
@MeganClerk да
А внутри трубы использовать кран? В чем разница, если игрушка использует кран снаружи после каждого concatMap? Что делать, если возникает ошибка?
У вас должен быть оператор catchError независимо от обработки ошибок. Вы можете выбрать, будете ли вы передавать concatMap с помощью касания и catchError ИЛИ оставить его как мой ответ и catchError в основном потоке.
Да, но проблема в том, что если
concatMap
имеет ошибку, она все равно вызываетtap()
?