Почему rxjs debounceTime не работает с наблюдаемыми объектами, созданными с помощью оператора 'of'? - PullRequest
0 голосов
/ 12 января 2019

Использование angular 7 и rxjs 6:

<input (input)="onChange($event.target.value)">

Почему следующее не вызывает сомнений?

onChange(val: string) {
  of(val)
    .pipe(        
      debounceTime(300)        
  ).subscribe(valx => {
    console.log(valx);
  });
}

Но это так:

  searchTerm$: Subject<string> = new Subject();

  this.searchTerm$.pipe(      
    debounceTime(300),    
  ).subscribe(val => {
   console.log(val);
  });


onChange(val: string) {   
  this.searchTerm$.next(val);
}

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Это не из-за of(). В первом примере каждый раз, когда вы звоните onChange($event.target.value), вы создаете новую цепочку со своим собственным debounceTime и собственным таймером. Поэтому он никогда ничего не отменяет, потому что каждое изменение ввода имеет свою собственную цепочку.

Однако, если вы используете Subject (как в вашем втором примере) и проталкиваете все события через this.searchTerm$.next(val), тогда у вас есть только одна цепочка, где каждое событие выдвигается вверх, а затем отклоняется, как вы ожидаете.

0 голосов
/ 12 января 2019

Рассмотрим вашу логику. Вы создадите финального наблюдателя для каждого onChanges. Он не дебютирует, потому что наблюдатель уже завершен, и дебагинг состоит в том, чтобы предотвратить испускание одного из них в случае, если другой придет. Таким образом, для оправдания (или более) необходимы как минимум два выброса, и этого не может произойти, если в обратном вызове создан наблюдатель.

...