Javascript 我应该如何将TakeTill与返回可观测值的可观测值一起使用?
我试图创建一个用于观看websocket事件的可观察对象 第一个可观察对象为每个连接事件调用onNext,并将连接的websocket实例作为下一个值传递 然后需要创建另一个可观察对象,用于侦听从该套接字断开连接的事件。当此类事件发生时,则需要完成第一个可观察事件。我在想一些关于扁平化或合并的事情,但是我不确定使用的正确方法Javascript 我应该如何将TakeTill与返回可观测值的可观测值一起使用?,javascript,rxjs,reactive-programming,Javascript,Rxjs,Reactive Programming,我试图创建一个用于观看websocket事件的可观察对象 第一个可观察对象为每个连接事件调用onNext,并将连接的websocket实例作为下一个值传递 然后需要创建另一个可观察对象,用于侦听从该套接字断开连接的事件。当此类事件发生时,则需要完成第一个可观察事件。我在想一些关于扁平化或合并的事情,但是我不确定使用的正确方法 // create an observable for each new socket connection event to server const getSocket
// create an observable for each new socket connection event to server
const getSocketObservable = (socketServer) =>
Observable.fromEvent(socketServer, 'connection')
.takeUntil(
socket => Observable.fromEvent(socket, 'disconnect')
)
这是我的两个测试用例
describe('getSocketObservable', () => {
let wss = null
let mockSocket = null
beforeEach(() => {
wss = new WebSocket.Server({ port: 3000 });
mockSocket = new EventEmitter()
})
afterEach((done) => {
wss.close(done)
})
it('returns observable on new server connection event', () => {
const onNext = spy()
getSocketObservable(wss).subscribe(
value => onNext(value),
)
wss.emit('connection', mockSocket)
expect(onNext.calledWith(mockSocket)).toBe(true)
})
it('returned observer source should complete when socket disconnects', () => {
const onCompleted = spy()
getSocketObservable(wss).subscribe(
value => console.log(value),
err => console.log(err),
onCompleted
)
wss.emit('connection', mockSocket)
mockSocket.emit('disconnect')
expect(onCompleted.calledOnce).toBe(true)
})
})
下面使用take(1)的简单方法使测试用例通过。但是,我需要只在断开连接事件上完成结果可观测,而不是在第一个任意值之后
export const getSocketObservable = (socketServer) =>
Observable.fromEvent(socketServer, 'connection').take(1)
我如何才能通过上述测试?为什么您需要可观察对象在断开连接之前保持活动状态?如果它是为了监听连接并转发套接字实例,那么它还有什么用呢?连接事件是一个单一的事件流,不是吗?观察者正在监视套接字服务器的连接事件。每当连接新套接字时,就会触发此事件。多个插座可以同时连接。因此,此可观察事件是多个连接事件的流。但是,我认为在服务器关闭之前,不应该完成可观察的操作。在第一个代码块中,您调用
.fromEvent(socket,'disconnect')
。这是否意味着断开该套接字实例(意味着其他套接字仍然打开)?您上次的评论给我的印象是,您希望侦听套接字服务器本身是否关闭。更正给定的套接字实例会发出该事件。如果我理解正确,每个socketServer连接都会生成一个新的套接字实例,对吗?所以,一旦单个套接字实例断开连接,您想完全停止侦听socketServer连接事件吗?即使存在其他打开的套接字实例?