rxjs,如何通过两个触发器获取最新数据并知道谁被触发?

时间:2021-06-05 19:29:10

标签: angular rxjs

我有这个代码: https://stackblitz.com/edit/angular-ivy-cmano3?file=src/app/app.component.ts

<button (click)="trigger1.next()">Button 1</button>
<button (click)="trigger2.next(false)">Button 2</button>

{{ myObservable$ | async }}

export class AppComponent implements OnInit {
  trigger1 = new Subject<void>();
  trigger2 = new BehaviorSubject<boolean>(false);
  data$ = of('some data');

  myObservable$ = new Observable<number>();

  ngOnInit() {
    this.myObservable$ = someMagicOerator([data$, trigger1, trigger2]).pipe(
      map(
        ([
          latestData,
          isTrigger1Triggered,
          isTrigger2TriggeredWithBoolData
        ]) => {
          if (isTrigger1Triggered) {
            //I want to access here latesData from data$
            console.log(latestData);
            return 1;
          } else if (isTrigger2Triggered) {
            //I want to access here latesData from data$
            //and access trigger2 boolean data
            console.log(latestData);
            console.log(trigger2BooleanData);
            return 2;
          }
        }
      )
    );
  }
}

我想在按下按钮1时得到结果1,按下按钮2时得到结果2 .并且在这两种情况下都需要访问来自 data$ 和来自 triger2 的数据的最新数据。 有任何想法吗?谢谢

1 个答案:

答案 0 :(得分:1)

<块引用>

从 data$ 和 trigger2 访问最新数据

对我来说听起来很像 combineLatest,但不确定它是否是您正在寻找的缓存行为。

也许你还需要将你的 Observable 拆分成两个 Observable 以便区分两次按钮点击:

this.myObservable$ = merge(
  combineLatest([data$, trigger1]).pipe(
    map(([latestData]) => {
      // access latestData here;
      return 1;
    })
  ),
  combineLatest([data$, trigger2]).pipe(
    map(([latestData, booleanValue]) => {
      // access latestData and booleanValue here;
      return 2;
    })
  )
);

我正在使用 mergethis.myObservable$ 的用户将两个 Observable 合并为一个。