【问题标题】:How to return a value using the previous and the current value of a BehaviorSubject?如何使用 BehaviorSubject 的先前值和当前值返回值?
【发布时间】:2021-05-04 15:51:24
【问题描述】:

在我的 Angular 应用程序中,我有一个用户服务、一个 activeUser$ behaviorSubject 和一个 loggedIn$,它们将基于 activeUser$ 的值(管道(映射))为真或假。 当 loggedIn$ 的下一个值是 true 然后是 false 时,这意味着用户已经注销。 有一个函数我只想在它为 true 然后为 false 时触发。结果,一个loggedOut$ observable 会很棒! 有什么想法吗?

【问题讨论】:

标签: angular rxjs pipe behaviorsubject


【解决方案1】:

详细了解成对运算符here

在您的情况下,代码将是这样的:

    loggedOut$ = this.loggedIn$.pipe(
      pairwise(),
      filter(([previous, current]) => previous && !current)
    ).subscribe(...)

【讨论】:

  • 请注意,订阅将不再包含布尔值,而是每个发射包含两个布尔值的数组(具有前一个值和当前值)
  • 你可以映射它,返回void而不是数组,因为值不再相关,只有事件是。
  • 谢谢大家!我刚刚发现 distinctUntilChanged learnrxjs.io/learn-rxjs/operators/filtering/… 。您如何将其与成对进行比较? logsOut$ = this.loggedIn$.pipe( distinctUntilChanged(), map((current) => !current) );
  • @MianalaLoharano distinctUntilChanged 允许您不触发事件,如果它具有与前一个相同的值。就您而言,这不是您想要的。此答案中使用的过滤器将完成这项工作,因此它仅在前一个值为 true 且当前值为 false 时触发事件。
  • 您更清楚自己需要什么!)
【解决方案2】:

刚刚从here找到了我需要的答案

我是这样实现的:

loggedOut$ = this.loggedIn$.pipe(
    distinctUntilChanged(),
    map((current) => !current)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多