【问题标题】:Behavior subjects (Rxjs) gets called automatically行为主体 (Rxjs) 被自动调用
【发布时间】:2021-04-30 08:41:20
【问题描述】:

我正在以如下方式使用 RxJs 行为主题。

=> 为所有行为主体提供公共服务,如下面的示例代码

@Injectable()
export class ProjectJobSelectionService {

public postTypeSubject = new BehaviorSubject(PostType.Project);
public selectedProjectSubject = new BehaviorSubject(null);
public selectedJobsiteSubject = new BehaviorSubject(null);
public selectedJobSubject = new BehaviorSubject(null);
public addJobsiteSubject = new BehaviorSubject(null);

}

我有一个侧边栏组件,每次在下一个方法上都需要刷新,否则任何新值都会从各个组件发出。

侧边栏是所有这些主题都在 ngOnInit 方法中订阅的公共组件,并且这些主题是下一个(我的意思是从各个受尊重的组件发出值)

问题

每次这些主体都被自己调用,并且当没有相应的组件被实例化或不在生命周期中时,所尊重的逻辑被调用。

无法检索它的原因,还尝试注释下它获取的代码仍然被自动调用。

任何帮助将不胜感激。

【问题讨论】:

  • BehaviorSubject 在每次订阅时自动发出最新的next(或默认值),所以这可能是您遇到的问题?
  • 是的,所以我的意思是如果有这样的 public selectedProjectSubject = new BehaviorSubject(null);如果是的话,它会自行发射,那么如何克服它?因为我希望仅在下一个时才有效
  • 很抱歉,我认为我没有跟随。我想我需要看一下它的功能以及您希望它做什么的演示。
  • 尝试使用Subject而不是BehaviorSubject,BehaviorSubject发出最后一个值(在第一次默认值你已经创建它,在这种情况下为null)总是你订阅,Subject只在你订阅后发出值,你'只会发出新的值

标签: angular rxjs rxjs-observables


【解决方案1】:

听起来你确实想要 BehaviourSubject 提供的默认值。

您可以尝试两种解决方案:

1) 过滤空值

无论您在何处订阅 BehaviorSubject,您都可以像这样忽略空值:

selectedJobsiteSubject.pipe(
  filter(v => v != null)
).subscribe(
  /* ... */
);

2) 没有默认值

没有默认值的 BehaviourSubject 只是一个 ReplaySubject,它在订阅时重放最近的发射。

因此您可以将服务更改为如下所示:

@Injectable()
export class ProjectJobSelectionService {

  public postTypeSubject = new BehaviorSubject(PostType.Project);
  public selectedProjectSubject = new ReplaySubject(1);
  public selectedJobsiteSubject = new ReplaySubject(1);
  public selectedJobSubject = new ReplaySubject(1);
  public addJobsiteSubject = new ReplaySubject(1);

}

【讨论】:

    【解决方案2】:

    所有类型的Subjects(包括BehaviourSubject)的重点是它们很热,即即使没有订阅者它们也会发射。 如果您不希望这种行为,您应该考虑使用(冷)Observable,或者使用没有初始值的Subject(或类似的)。

    【讨论】:

    • 我要改写第一个语句:BehaviourSubject 的重点不是它们很热(Subject 也很热),而是它采用默认值并且可以保持/存储当前值并立即将其发送给未来的订阅者。我同意其余的答案。
    • 没错,感谢您指出这一点。我已经改写了这句话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2018-03-13
    相关资源
    最近更新 更多