我有一个值限制,我使用下限和上限限制,并减少日志记录的数量,如果它们发生更改,我只想发出值。问题是以下代码段中的第二个distinctUntilChanged()
仍然会产生重复:
Observable // emits i.e. [2, 2, 2, 5, 5, 10, 20]
.distinctUntilChanged() // becomes [2, 5, 10, 20]
.map(target => {
const correctedTarget = Math.min(Math.max(target, MINIMUM), MAXIMUM); // Let's say min: 5, max: 10
if(correctedTarget != target) {
logger.warn(`Prediction wants to scale out-of-bounds to ${target}, limiting to ${correctedTarget}`);
}
return correctedTarget;
}) // becomes [5, 5, 10, 10]
.distinctUntilChanged() // should be [5, 10], but is [5, 5, 10, 10]
RxJs文档声明过滤器默认为简单的相等比较,所以我希望这应该是Just Work™。
答案 0 :(得分:1)
我的一位同事(再一次)确定了问题(也感谢帮助Matt)。事实证明,最初的假设是错误的 - 代码的轮廓如下:
Observable // emits credentials on some interval
.flatmap(credentials => {
return Observable2.doSomething()
.distinctUntilChanged()
...
})
如您所见,distinctUntilChanged
被链接到Observable2
,每次发出凭据时都是一个新的可观察流。这也解释了为什么我所做的比较器功能根本没有被调用:每次只有一个值,所以没有什么可比较的。
答案 1 :(得分:0)
只需在此处添加此内容,因为此问题是“重复值”的最佳匹配。
使用RxJS 6中所需的新管道语法,很容易将括号放在错误的位置。这对我来说是重复的值。
此处的目的是输出YouTube视频的getCurrentTime()
值。
this.currentTime = this.timer.pipe(
filter(i => this.isReady),
map(i => this.ytPlayer.getCurrentTime(),
distinctUntilChanged()));
this.currentTime = this.timer.pipe(
filter(i => this.isReady),
map(i => this.ytPlayer.getCurrentTime()),
distinctUntilChanged());
我会留给读者发现差异。请注意,此已使用typescript进行编译。