Rxjs`distinctUntilChanged()`似乎无法正常运行

时间:2019-02-24 21:18:01

标签: rxjs lodash rxjs-pipeable-operators

在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流非常复杂,但是我不希望这种复杂性对{{1}中的const equal应该始终=== false产生任何影响}运算符。

我只是想了解发生了什么,因此感谢所有信息。谢谢!

更新

应该注意,如果我将代码更改为:

tap

然后过滤将按预期进行。 I was under the impression that distinctUntilChanged(isEqual) was equivalent to:

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运算符?

1 个答案:

答案 0 :(得分:0)

我知道了!感谢rxjs issue中的评论:我无意中多次订阅了可观察的内容(这本不应该发生)。多个console.log实例来自不同的订阅实例。