RxJs:distinctUntilChanged仍然会发出重复值

时间:2016-08-01 12:32:52

标签: javascript rxjs

我有一个值限制,我使用下限和上限限制,并减少日志记录的数量,如果它们发生更改,我只想发出值。问题是以下代码段中的第二个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™。

2 个答案:

答案 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进行编译。