Angular 2+仅在更改时订阅observable

Gab*_*iel 3 observable behaviorsubject angular2-observables angular

所以这是场景.我有一个带有BehaviorSubject的用户服务和一个返回此BehaviorSubject的observable的方法.我的第二个文件是订阅observable的标题组件.问题是..是否可以只订阅更改或者我需要在之前有一些逻辑this.userSubject.next(this.user)吗?

这里是参考代码:

// user.service.ts
user: User;
private userSubject = new BehaviorSubject<User>(new User({}));

keepUpdated = () => {
  this.tokenService.tokenStream()
    .subscribe(token => {
      this.user.update(token);
      this.userSubject.next(this.user);
    });
}
Run Code Online (Sandbox Code Playgroud)

和这里

// header.component.ts
ngOnInit() {
  this.userService.keepUpdated();
  this.userService.userStream()
    .subscribe(user => {
      // Here is the problem. This console.log gets called everytime userSubject.next(this.user) send something. I would like it only only to be called if the user is different from the previous one.
      console.log(user);
    });
}
Run Code Online (Sandbox Code Playgroud)

Sup*_*miu 8

您可以使用distinctUntilChanged运算符(文档):

ngOnInit() {
  this.userService.keepUpdated();
  this.userService.userStream()
    .distinctUntilChanged()
    .subscribe(user => {
      console.log(user);
    });
}
Run Code Online (Sandbox Code Playgroud)

这应该通过将每个发射值与前一个值进行比较来过滤它们,如果它不同,则会调用订阅,否则不会.