【发布时间】:2019-02-24 21:18:01
【问题描述】:
在 rxjs 流中,我使用 distinctUntilChanged 和 lodash 的 isEqual 过滤掉重复值。但是它似乎没有按预期工作。取如下代码sn -p
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);
})
)
}
然后过滤按预期工作。 I was under the impression that distinctUntilChanged(isEqual) was equivalent to:
filter(val => {
const equal = isEqual(cachedValue, val);
cachedValue = val;
return !equal;
})
我误会/误解了distinctUntilChanged 运算符吗?
【问题讨论】:
标签: rxjs lodash rxjs-pipeable-operators