Rx: Выполнить код после завершения всех подписок для одного «следующего» - PullRequest
0 голосов
/ 04 апреля 2019

Скажем, у меня есть тема где-то в моем коде

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 голосов
/ 05 апреля 2019

RxJS не имеет такого обратного (вверх?) распространения события, если только оно не является подпиской / отпиской.

Строго говоря: это не Rx-способ иметьэто отношение между подписчиком и наблюдаемым .

Тем не менее, есть способы достичь этого:

  • вы могли бы обработать другого субъекта (ов) для «подталкивания»"Уведомления, и обрабатывать из вашей наблюдаемой.Кошмарная вещь для поддержки, imho

  • попросите ваших подписчиков на переподписать и отреагируйте на это заметным.Предположение о распространении событий подписки / отписки.Кажется еще кошмарнее.И он должен

  • иметь какое-то противодавление, самое простое из которых - concatMap, внутри которого вы можете выполнить все свои операции.Тем не менее, с этим подходом вам придется переосмыслить эти отношения генератор-обработчик

Вот грубая иллюстрация потока с использованием concatMap

                                handler1
source$ -> concatMap( forkJoin( handler2 ) ) -> subscribe( here all handlers finished )
                                handler3

Если вы хотите узнать больше о противодавлении, вот статья о методах противодавления в RxJS

...