rxjs:一次点击多个主题

问题描述 投票:0回答:1

给定两个主题

s1
s2
并订阅,

const s1 = new Subject<number>();
const s2 = new Subject<number>();

s1.subscribe({
  next: (value) => console.log("s1 emitted", value),
  complete: () => console.log("s1 completed"),
});

s2.subscribe({
  next: (value) => console.log("s2 emitted", value),
  complete: () => console.log("s2 completed"),
});

并且给定一个可观察的,比如

of(1)
,我可以像这样通过
s1
进行管道传输:

of(1).pipe(tap(s1)).subscribe();

产生输出

s1 emitted 1
s1 completed

但是如果您想同时通过

s1
s2
进行管道传输怎么办? 我当然可以做这样的事情:

of(1)
  .pipe(tap((x) => [s1, s2].forEach((s) => of(x).subscribe(s))))
  .subscribe();

产生输出

s1 emitted 1
s1 completed
s2 emitted 1
s2 completed

但是有更好/更短的方法吗?我尝试了

merge
等等,但没有任何效果。

javascript typescript rxjs observable subject-observer
1个回答
0
投票

也许您可以创建一个实用函数来将多个

Observer
合并为一个。

function mergeObservers<T>(...obs: Observer<T>[]): Observer<T> {
  return {
    next: (v) => obs.forEach((ob) => ob.next(v)),
    error: (v) => obs.forEach((ob) => ob.error(v)),
    complete: () => obs.forEach((ob) => ob.complete()),
  };
}

const merged = mergeObservers(s1, s2);

of(1).pipe(tap(merged)).subscribe()

// s1 emitted 1
// s2 emitted 1
// s1 completed
// s2 completed
© www.soinside.com 2019 - 2024. All rights reserved.