11

在 rxjs 流中,我使用distinctUntilChangedlodashisEqual过滤掉重复值。但是,它似乎没有按预期工作。采取以下代码片段

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);
      })
    )
}

然后过滤按预期工作。我的印象distinctUntilChanged(isEqual)相当于:

filter(val => {
  const equal = isEqual(cachedValue, val);
  cachedValue = val;
  return !equal;
})

我误会/误解了distinctUntilChanged运营商吗?

4

1 回答 1

19

我想到了!感谢rxjs 问题中的评论:我不小心多次订阅了 observable(这不应该发生)。多个console.log实例来自不同的订阅实例。

于 2019-02-24T21:53:24.937 回答