Основная проблема здесь заключается в том, что switchMap
используется для преобразования значений для передачи определенной формы в поток. Если ваше значение resultB
не является частью этой формы, то операторы, расположенные дальше по цепочке, не будут иметь к ней доступа, потому что они получают только испускаемую форму.
Итак, есть в основном 2 варианта:
- передать промежуточную форму, содержащую ваше значение
- используйте вложенный канал, чтобы поместить обе части данных в одну и ту же область оператора
Предложенные до сих пор решения включают отображение на промежуточный объект. Я предпочитаю использовать вложенный канал, чтобы данные, проходящие через поток, имели значимую форму. Но на самом деле все сводится к предпочтениям.
Используя вложенный канал, ваш код будет выглядеть примерно так:
streamA$.pipe(
switchMap(resultA => {
const streamB$ = resultA ? streamB1$ : streamB2$;
return streamB$.pipe(
switchMap(resultB => loadData(resultB).pipe(
tap(data => {
// you can access resultB here
})
))
);
})
);
Примечание: вы можете использовать iif
для условного выбора исходного потока:
streamA$.pipe(
switchMap(resultA => iif(()=>resultA, streamB1$, streamB2$).pipe(
switchMap(resultB => loadData(resultB).pipe(
tap(data => {
// you can access resultB here
})
))
))
);
Может быть полезно разбить часть логики на отдельные функции:
streamA$.pipe(
switchMap(resultA => doSomeWork(resultA)),
miscOperator1(...),
miscOperator2(...)
);
doSomeWork(result) {
return iif(()=>result, streamB1$, streamB2$).pipe(
switchMap(resultB => loadData(resultB).pipe(
tap(data => {
// you can access resultB here
})
))
))
}
person
BizzyBob
schedule
15.09.2020
resultA
вtap
, где вы хотите получить доступ кresultB
. Почему? Ответ на этот вопрос должен сказать вам, что вам нужно сделать, чтобы получить доступ кresultB
в файлеtap
. - person frido   schedule 14.09.2020