我有一个值流,我使用下限和上限来限制这些值,为了减少日志记录量,我只想在值发生变化时发出值。问题是以下代码段中的第二个 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™。

最佳答案

我的一位同事(再次)发现了这个问题(也感谢 Matt 的帮助)。事实证明,最初的假设是错误的——代码大纲如下:

Observable // emits credentials on some interval
.flatmap(credentials => {
  return Observable2.doSomething()
         .distinctUntilChanged()
         ...
})

如您所见, distinctUntilChanged 被链接到 Observable2 ,每次发出凭据时,它都是一个新的可观察流。这也解释了为什么我制作的比较器函数根本没有被调用:每次只有一个值,所以没有什么可比较的。

关于javascript - RxJs:distinctUntilChanged 仍然发出重复值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38699020/

10-11 13:32