Как оставаться подписанным *, пока * генерируются определенные типы событий? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть один, который я не могу понять

В основном у меня есть поток полиморфных событий, и я хочу подписать наблюдаемое "while" в данном состоянии, то есть предыдущий emit был событием того же типа, затем сохранитьподписка и просто прокси для события

Events = (A|B)
stream: A1 A2 B1 B2 B3 A3 A4 A5 B4 B5 B6
              ^------^          ^------^
              subscribed        subscribed

проблема в том, как прикрепить наблюдаемое без его повторной подписки, то есть

events.switchMap {
   if(it is B) {
      somethingIWant()
   } else {
      Observable.empty()
   }
}

, что, очевидно, будет продолжать повторную подписку чего-либо в случае B1, B2, ...

Мне нужно, чтобы он оставался подписанным во время Bs, и если придет что-то еще, кроме B, отмена подписки

events.ofType(B) также не будет работать, потому что это не откажется от подписки вниз по течению, если A приходит в основном, я хочуусловная карта переключения, с возможностью отправки через уже подписанный поток, что не вполне возможно

1 Ответ

0 голосов
/ 24 сентября 2019

Rxjs предоставляет конвейерный оператор, который испускает только те значения, которые требуются.

Здесь Внизу events.pipe(filter => 'if it is B')

Он не будет генерировать события A.

console.clear()
const appDiv = document.getElementById('app');
appDiv.innerHTML = `<h1>RXJS Filter - fromEvent -fire -click or dblClick Event</h1>`;
const { fromEvent,merge } = rxjs;
const { map, filter }= rxjs.operators;
// common function to display event
const dipslayEvent = (event2,message) => {
   console.log(message, ' ', event2.type);
   appDiv.innerHTML += '<h5> '+ message + ' '+ event2.type +' <h5>'
}
//create observable that emits dblclick events
const source = fromEvent(document, 'dblclick');
//create observable that emits click events
const source1 = fromEvent(document, 'click');
// mergring the observales   
const event = merge(source,source1);
event.subscribe(event1 => dipslayEvent(event1,'event fired'))
//filterout the event that are requied
const example = event.pipe(filter(event => event.type === 'dblclick'));
// only subsacribed to those event that are required
const subscribe = example.subscribe(event1 => dipslayEvent(event1,'event as per required'));
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.min.js"></script>
<div id="app"></div>

Здесь решение stackblitz

...