В дополнение к предложению Мартина merge()
я бы также "поделился" результатом пользователей, чтобы предотвратить повторный запуск resolve
.
RXJS будет проходить через все каналы каждый раз, когда добавляется подписка,Думайте о них как о преобразователях, где «хранилище данных» является начальным Subject
(this.search.valueChanges
).Поэтому каждый раз, когда вы подписываетесь, RXJS будет проходить через ваши каналы, чтобы получить преобразованное значение.
Итак, вы хотите посмотреть на RXJS share()
или shareReplay(1)
.Что они будут делать, так это внутренне создадут new Subject()
(в случае share()
) или new ReplaySubject(1)
(в случае shareReplay(1)
) для хранения вашего преобразованного значения в новом «хранилище данных», если хотите.
search = new FormControl('');
otherUsers$ = new Subject();
users$ = merge(
otherUsers$,
this.search.valueChanges.pipe(
startWith(this.search.value)),
debounceTime(250)),
distinctUntilChanged()),
switchMap(this.resolve))
)
).pipe(share());
Subject
против ReplaySubject
зависит от того, хотите ли вы сохранить значение, даже если нет подписки.(Это моя интерпретация, основанная на моем собственном использовании.) Я нашел shareReplay(1)
полезным в тех случаях, когда у меня есть подписки, такие как obs.pipe(first()).subscribe(...)
.Однако одна из ваших подписок - это AsyncPipe
в DOM, так что вы, вероятно, в порядке с share()
, но попробуйте сами.