#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
и три наблюдаемых (которые все используют один и тот же источник), и с этого момента вы можете запускать обработчики везде, где захотите.
Я бы не сказал, что мое решение лучше, поскольку и ваше, и мое будут работать одинаково, но в моей версии я использовал более реактивный / функциональный подход. Преимущества этого подхода заключаются в том, что вы можете расширить функциональность сокета более простым способом.