3

所以这里是场景。我有一个带有 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);
    });
}

和这里

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

2 回答 2

8

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

ngOnInit() {
  this.userService.keepUpdated();
  this.userService.userStream()
    .distinctUntilChanged()
    .subscribe(user => {
      console.log(user);
    });
}

这应该通过将每个发出的值与前一个值进行比较来过滤每个发出的值,如果不同,则将调用订阅,否则不。

于 2017-05-18T09:31:31.793 回答
1

新 Rxjs 版本的更新答案:使用.pipe(distinctUntilChanged())

ngOnInit() {
    this.userService.keepUpdated();
    this.userService.userStream()
        .pipe(distinctUntilChanged())
        .subscribe(user => {
          console.log(user);
        });
}
于 2021-07-01T21:38:07.303 回答