接收:完成所有“下一个”订阅后,运行代码

时间:2019-04-04 16:18:16

标签: ecmascript-6 rxjs reactive-extensions-js

说我的代码中有一个主题

mySubject$ = new Subject()

在代码的其他地方,可以进行任意数量的订阅,例如

someSubscription = mySubject$.subscribe(() => console.log('I love streams'))
anotherSubscription =  mySubject$.subscribe(() => console.log('me too!'))

.next()主题时,两个订阅均按预期触发。

我该如何加入rx机制,以便在所有订阅都完成其代码运行后(对于单个next事件),我可以运行一些代码?

是否有类似mySubject$.onAllSubscriptionsCompleted(() => console.log('all done')

的内容

或者实现此目的的替代方法是什么?

1 个答案:

答案 0 :(得分:0)

RxJS没有这样的向后(向上?)事件传播,除非它是订阅/取消订阅。

严格地说:在订户和可观察者之间建立这种联系不是一种接收方式

但是,有多种方法可以实现:

  • 您可能还有另一个主题,可以将“已处理”通知推送到可观察对象并从中进行处理。噩梦般的支持,恕我直言

  • 让您的订阅者重新订阅,并对您的观察结果做出反应。关于该订阅/取消订阅事件传播的推测。似乎更加噩梦。而且应该

  • 具有某种背压,其中最简单的是concatMap,您可以在其中进行所有处理。但是,使用这种方法,您将不得不重新考虑那些生成器与处理程序之间的关系

使用concatMap

粗略地说明了流程
                                handler1
source$ -> concatMap( forkJoin( handler2 ) ) -> subscribe( here all handlers finished )
                                handler3

如果您想了解更多有关背压的信息,请访问backpressure techniques in RxJS