BehaviourSubject上的distinctUntilChanged()不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BehaviourSubject上的distinctUntilChanged()不起作用相关的知识,希望对你有一定的参考价值。

我的package.json:

  • rxjs“:”^ 5.5.6“
  • @angular:“6.0.0-beta.5

searchTextValueSubject是一个BehaviorSubject

import { debounceTime } from 'rxjs/operators';
import { distinctUntilChanged } from 'rxjs/operators';
import { pipe } from 'rxjs';

this.sharingVariableService
    .searchTextValueSubject
    .pipe(
        distinctUntilChanged((x, y) => {
            console.log(y.BarCodeS === x.BarCodeS);
            console.log(y.BarCodeS);
            console.log(x.BarCodeS);
            return y.BarCodeS === x.BarCodeS
        })
    )
    .subscribe((searchTextValue) => {
        this.searchTextValue = searchTextValue;
        this.getRessourceHardware(this.serverDataRessourceHardware._meta.max_results, this.searchTextValue);
    });

结果:

是的,'d','d'

工作,听,听

预期:

错,'','d'

错,'d','来自'

我可能听不懂。你能指点我正确的方向吗?

答案

看起来你可能会向searchTextValueSubject发送变异值。

确保你的代码没有做这样的事情......

let value = {BarCodeS: 'd'}
this.sharingVariableService.searchTextValueSubject.next(value);

value.BarCodeS = 'da'; // wrong!
this.sharingVariableService.searchTextValueSubject.next(value);

正确的方法是:

const value0 = {BarCodeS: 'd'}
this.sharingVariableService.searchTextValueSubject.next(value0);

const value1 = {...value0, BarCodeS: 'da'}; // right
this.sharingVariableService.searchTextValueSubject.next(value1);

还要注意,在第一次发射时从不调用distinctUntilChanged比较器函数(第一次发射必然是不同的)

以上是关于BehaviourSubject上的distinctUntilChanged()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 中的共享服务和 Observable、BehaviourSubject

使用“* ngIf”的Component构造函数中的BehaviourSubject订阅会抛出“ExpressionChangedAfterItHasBeenCheckedError”

sql distinc con conchasoloaño

Spark入门--Spark的intersectionsubtractunion和distinc

无法订阅 BehaviorSubject

如何重新发出主题的最后一个值