繁体   English   中英

如何组合 2 个或多个 observables 以便您知道哪个发出了?

[英]How to combine 2 or more observables so that you know which emitted?

假设你有 2 个 observables:

const obs1$: Observable<string[]> = this.getObs1$();
const obs2$: Observable<string[]> = this.getObs2$();

我想将这两个结合起来,以便在订阅(或 rxjs 地图)中我知道哪个发出了这些值。 我不能使用 combineLatest 因为对于另一个可观察的我只是得到它在某个时候发出的最新值。

似乎没有一个纯粹的 RxJS 解决方案(但希望有人能证明我错了!)

您可以使用外部 scope 中的变量来跟踪发射的 observable 作为解决方法

let trigger: TriggerEnum;

const obs1$: Observable<string[]> = this.getObs1$()
  .pipe(tap(() => trigger = TriggerEnum.One));
const obs2$: Observable<string[]> = this.getObs2$()
  .pipe(tap(() => trigger = TriggerEnum.Two));;

combineLatest(....).subscribe(
 // check trigger value
);

从文档中以防万一:请注意,在每个可观察对象发出至少一个值之前, combineLatest 不会发出初始值

您可以使用merge将两个 observable 组合成一个 observable。 然后,按照@martin 的建议和 map 将每个源的排放量转换为一个可以识别源的小结构:

const obs1$: Observable<number[]> = getNumbers();
const obs2$: Observable<string[]> = getLetters();

const combined$ = merge(
  obs1$.pipe(map(data => ({ source: 'obs1$', data }))), 
  obs2$.pipe(map(data => ({ source: 'obs2$', data })))
);

combined$.subscribe(
   ({ source, data }) => console.log(`[${source}] data: ${data}`)
);

// OUTPUT:
//
// [obs1$] data: 1
// [obs2$] data: A
// [obs2$] data: A,B
// [obs2$] data: A,B,C
// [obs1$] data: 1,2
// [obs2$] data: A,B,C,D
...

这是一个小小的StackBlitz示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM