在 rxjs 流中,我使用distinctUntilChanged
lodashisEqual
过滤掉重复值。但是,它似乎没有按预期工作。采取以下代码片段
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
运营商吗?