В потоке 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
?