#angular #typescript #rxjs
Вопрос:
Я пытаюсь реализовать функцию rxjs distinctuntuntilchanged, но безрезультатно …
public searchVal(val: string) { this.suggestions = (new Observable((observer: Observerlt;stringgt;) =gt; { observer.next(val); })).pipe( takeUntil(this.destroy$), distinctUntilChanged(), switchMap((query: string) =gt; { if (query) { console.log('query query' , query) } return of([]); }) ); }
но это не работает, я не знаю, почему? Я также настроил время дебюта, но оно тоже не работает?
Мой план не состоит в том, чтобы отправлять одни и те же значения.
Комментарии:
1. Вы подписываетесь?
Ответ №1:
new Observable((observer: Observerlt;stringgt;) =gt; { observer.next(val); })
Это только of(val)
за исключением завершения наблюдаемого. Кроме того, как правило takeUntil
, оператор должен приходить последним. Это изменит ваш код на
public searchVal(val: string) { this.suggestions = of(val).pipe( distinctUntilChanged(), switchMap(query =gt; of([])), takeUntil(this.destroy$), ); }
Однако это совсем не то, что вы, вероятно, думаете. Каждый раз , когда вы звоните searchVal
, это создаст новое наблюдаемое и назначит его suggestions
, делая distinctUntilChanged
бесполезным, поскольку по каналу будет проходить только одно значение.
Что вы, скорее всего, захотите сделать, так это создать
private readonly input$ = new Subjectlt;stringgt;(); public readonly suggestions$ = defer(() =gt; this.input$).pipe( distinctUntilChanged(), switchMap(() =gt; of([])), takeUntil(defer(() =gt; this.destroy$)), );
и затем
public searchVal(val: string) { this.input$.next(val); }
defer()
Звонки-это просто уловка, чтобы избежать проблем с порядком объявления. Если вы вместо этого назначите suggestions$
, например, в конструкторе, вам не понадобятся defer
буквы s.