在rxjs流中,我将distinctUntilChanged
与lodash的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);
})
)
}
然后,筛选将按预期工作。 I was under the impression that
distinctUntilChanged(isEqual)
was equivalent to:filter(val => {
const equal = isEqual(cachedValue, val);
cachedValue = val;
return !equal;
})
我是否误解了
distinctUntilChanged
运算符?
最佳答案
我想到了!感谢rxjs issue中的注释:我无意中多次订阅了可观察的消息(这本不应该发生)。多个console.log
实例来自不同的订阅实例。
关于Rxjs `distinctUntilChanged()`似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54856654/