给定两个主题
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
等等,但没有任何效果。
也许您可以创建一个实用函数来将多个
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