使用RxJS为WebSocket流建模的方法有哪些。
我看到的显而易见的事情是套接字流,它们发出消息流。
如果我创建了一个套接字流,我如何创建其邮件流并仍保留发送这些邮件的人?
套接字流是我的第一步:
const socket$ = Observable.create(({complete, next}) => {
const server = new WebSocketServer({server: someHttpServer})
server.on('connection', next)
return () => {
server.close()
complete()
}
})
但是消息流有点困难,因为我需要从我那里得到消息的套接字。
这是我对模特的天真尝试:
const message$ = socket$.flatMap(socket => Observable.create(({complete, next}) => {
socket.on('message', next)
socket.on('close', complete)
return () => socket.close()
})).share()
从所有套接字流式传输所有套接字消息的observable。但是,如果我订阅它,我就不再有套接字,这使得它成为单向的。
我想要
socket$ -> message$ -> server-processing -> socket$
但是响应,广播,多播和单播有多种用例。
答案 0 :(得分:3)
我发现flatMap
接受第二个函数,它接收flatMap
的参数值和flatMap
的(展平的)返回值。此函数可以返回一个新值,该值用于所有后来的运算符。
const socketMessage$ = socket$.flatMap(
socket => Observable.create(({complete, next}) => {
socket.on('message', next)
socket.on('close', complete)
return () => socket.disconnect()
}),
(socket, message) => ({socket, message})
).share()
答案 1 :(得分:1)
不知道你要找的是什么(still preserve who sent these messages
是什么意思),但是有一个用于在可观察量中包装websockets的库。请查看此处的文档:https://github.com/Reactive-Extensions/RxJS-DOM/blob/master/doc/operators/fromwebsocket.md