DistinctUntilChange не работает с switchMap?

#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.