如何创建rxjs从未完成的主题

如何创建rxjs从未完成的主题,rxjs,rxjs5,Rxjs,Rxjs5,朋友们。通过动态订阅其他可观察对象,我得到一个主题c。但要在所有可观察到的完成时,才c完成而无需第一次完成 我该怎么做 const c = new Subject; const a = Observable.interval(100).take(3).mapTo('a'); const b = Observable.interval(150).take(3).mapTo('b'); a.subscribe(c); b.subscribe(c); c.subscribe(console.lo

朋友们。通过动态订阅其他可观察对象,我得到一个主题
c
。但要在所有可观察到的完成时,才
c
完成而无需第一次完成

我该怎么做

const c = new Subject;

const a = Observable.interval(100).take(3).mapTo('a');
const b = Observable.interval(150).take(3).mapTo('b');


a.subscribe(c);
b.subscribe(c);
c.subscribe(console.log);
实际产出

a
b
a
a
期待

a
b
a
a
b
b

这是正确的行为,因为主体有一个内部状态,当它收到
complete
通知时,它会将自己标记为“stopped”,并且永远不会发出任何东西。这正是你的例子所发生的。当您使用
a.subscribe(c)
时,您正在订阅
c
所有三种类型的通知,并且当源发出
complete
时,它也被
c
接收并停止发出

相反,您可以只订阅
c
next
通知:

a.subscribe(v => c.next(v));
b.subscribe(v => c.next(v));
然后,如果您希望在所有源完成时正确完成源,您可以执行以下操作(您还需要对所有源观测值使用
share()
):


可观察。合并(a,b)。订阅(c)-也不要像那样创建多个订阅。观察可能很难-不要让它们比实际工作更多:)如果你真的想使用一个主题,你可以使用
多播
-但是meh.hi谢谢@BenjaminGruenbaum。我想用这个主题
c
作为管道。作为一个全球管道。所以需要动态订阅多个可观察的。我仍然会静态地(使用
合并
),但是就像我说的,如果你坚持我会使用
多播
。谢谢,这会有用的。但是RXJ有一些优雅的风格吗?好吧,你期待什么优雅的方式?
const a = Observable.interval(100)...share();
const b = Observable.interval(150)...share();

...

Observable.forkJoin(a, b)
  .subscribe(() => c.complete());