我应该如何将takeUntil与一个返回Observable的Observable一起使用?

时间:2017-06-24 23:34:43

标签: javascript rxjs reactive-programming

我正在尝试创建一个观察websocket事件的observable。

第一个observable为每个连接事件调用onNext,并传递作为下一个值连接的websocket实例。

然后需要创建另一个observable来侦听从该套接字断开事件。当发生这样的事件时,需要完成第一个可观测事件。我正在考虑扁平化或合并的方法,但不确定正确的使用方法。

// 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)的以下天真方法使测试用例通过。但是,我需要完成生成的observable才会发生在断开事件之后,而不是在第一个任意值之后。

    export const getSocketObservable = (socketServer) =>
  Observable.fromEvent(socketServer, 'connection').take(1)

如何通过上述测试?

0 个答案:

没有答案