Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该如何将TakeTill与返回可观测值的可观测值一起使用?_Javascript_Rxjs_Reactive Programming - Fatal编程技术网

Javascript 我应该如何将TakeTill与返回可观测值的可观测值一起使用?

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

我试图创建一个用于观看websocket事件的可观察对象

第一个可观察对象为每个连接事件调用onNext,并将连接的websocket实例作为下一个值传递

然后需要创建另一个可观察对象,用于侦听从该套接字断开连接的事件。当此类事件发生时,则需要完成第一个可观察事件。我在想一些关于扁平化或合并的事情,但是我不确定使用的正确方法

// 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连接事件吗?即使存在其他打开的套接字实例?