Rxjs `DifferentUntilChanged ()`, кажется, не работает - PullRequest
0 голосов
/ 25 февраля 2019

В потоке rxjs я использую distinctUntilChanged с lodash's isEqual, чтобы отфильтровать повторяющиеся значения.Однако кажется не работает должным образом.Возьмем следующий фрагмент кода

import { isEqual } from 'lodash-es';

let cachedValue: any;

function testFn(observableVal: Observable<any>) {
  return observableVal
    .pipe(
      distinctUntilChanged(isEqual),
      tap(val => {
        const equal = isEqual(cachedValue, val);
        console.log('"output":', equal, cachedValue, val);
        cachedValue = val;
      })
    )
}

. В этом примере я ожидаю, что const equal внутри функции tap никогда не будет === true.Я ожидаю, что distinctUntilChanged(isEqual) отфильтрует любые значения, где isEqual(cachedValue, val) === true -> означает, что const equal === false всегда.Однако консольный вывод показывает:

"output": false undefined [ContactList]
"output": true [ContactList] [ContactList]
"output": true [ContactList] [ContactList]
"output": true [ContactList] [ContactList]

Не понимаю ли я что-то фундаментальное о том, как работает оператор distinctUntilChanged()?Я опубликовал упрощенный пример, потому что реальный поток rxjs очень сложен, но я не ожидаю, что сложность будет иметь какое-то значение, поскольку const equal всегда должен === false в операторе tap.

Я просто пытаюсь понять, что происходит, поэтому любая информация ценится.Спасибо!

Обновление

Следует отметить, что если я изменю код на:

function testFn(observableVal: Observable<any>) {
  return observableVal
    .pipe(
      filter(val => {
        const equal = isEqual(cachedValue, val);
        cachedValue = val;
        return !equal;
      }),
      tap(val => {
        console.log('"output":', val);
      })
    )
}

, тогда фильтрация будет работать как положено. У меня сложилось впечатление, что distinctUntilChanged(isEqual) было эквивалентно:

filter(val => {
  const equal = isEqual(cachedValue, val);
  cachedValue = val;
  return !equal;
})

Я ошибаюсь / неправильно понимаю оператор distinctUntilChanged?

1 Ответ

0 голосов
/ 25 февраля 2019

Я понял это!Благодаря комментарию к проблеме rxjs : я случайно подписался на наблюдаемое несколько раз (чего не должно было быть).Несколько экземпляров console.log были получены из разных экземпляров подписки.

...