Разделить событие сокета на несколько обработчиков / объектов с помощью rxjs

#typescript #rxjs

#typescript #rxjs

Вопрос:

У меня есть событие сокета под названием «имена»

и данные

 data : {
   action : "UPDATE" /"CREATE" /"DELETE"
   payload: {....}
}
 

теперь у меня есть 3 объекта и 3 наблюдаемых
, и я делаю что-то вроде:

  switch (){
   case : "UPDATE"
     this.updateSubject.next(val)
   case : "CREATE"
     this.updateSubject.next(val)
  case : "DELETE"
     this.updateSubject.next(val)
  }
    
 

Как я могу добиться этого лучшим способом?
Я пробовал с помощью FromEvent (сокет, ‘имена’)

но мне все еще нужны 3 объекта и 3 наблюдаемых

спасибо

Ответ №1:

Если я правильно понял ваш вопрос, вы хотите обработать 3 разных типа ответов от a socket с помощью одного объекта.

 let {
  interval,
  from,
  Subject
} = rxjs
let {
  take,
  concatAll,
  map,
  filter
} = rxjs.operators

 const types = {
  1: 'UPDATE',
  2: 'DELETE',
  3: 'CREATE'
 }


let ref = document.querySelector('#container')

/** Socket part*/
const _subject = new Subject();

const update$ = _subject.pipe(filter(x => x === 'UPDATE'), map(() => 'Update Handler'))
const delete$ = _subject.pipe(filter(x => x === 'DELETE'), map(() => 'Delete Handler'))
const create$ = _subject.pipe(filter(x => x === 'CREATE'), map(() => 'Create Handler'))

const socket$ = interval(1000).pipe( map(() => {
 const type = Math.ceil(Math.random()*3)
 return types[type]
}));
socket$.subscribe(x => _subject.next(x))

/** Handlers */

delete$.subscribe(x => console.log(x))
create$.subscribe(x => console.log(x)) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>

<div id="container"></div> 

С помощью этой реализации у вас есть одна Subject и три наблюдаемых (которые все используют один и тот же источник), и с этого момента вы можете запускать обработчики везде, где захотите.

Я бы не сказал, что мое решение лучше, поскольку и ваше, и мое будут работать одинаково, но в моей версии я использовал более реактивный / функциональный подход. Преимущества этого подхода заключаются в том, что вы можете расширить функциональность сокета более простым способом.