myWebSocketSubject.multiplex(..)。subscribe()。unsubscribe()关闭连接,事件进一步观察者存在

时间:2016-06-01 20:57:02

标签: websocket rxjs5

以下代码将关闭连接,myWebSocketSubject上存在进一步观察者的事件:

myWebSocketSubject.Observable.webSocket('ws://mysocket');
myWebSocketSubject.subscribe();
myWebSocketSubject.multiplex(..).subscribe().unsubscribe()
// the connection closed now

我的期望是,连接会在最后一次unsubscribe()调用时关闭(而不是第一次调用)。

使用案例

如果我做对了,使用multiplex(..)运算符,在创建并完成时,会向套接字发送一条消息,例如,允许在服务器端取消/订阅特定事件。

我首选的Web Socket服务可能如下所示。只存在一个连接,此单个连接提供多个流。在第一次订阅Web套接字时,会创建连接;并且在最后一次取消订阅时,连接将被关闭。对于每个数据流,发送一次un / / subscribe消息。

我还没有找到使用WebSocketSubject.multiplex(..)方法的解决方案......

首选示例Web插槽服务

export class WebSocketService {
    connection: WebSocketSubject<any>;
    constructor() {
        this.connection = Observable.webSocket<any>(_createConfig())
    }

    dataStream(eventType: string): Observable<WebSocketMessage> {
        return connection.multiplex(
            () => new WebSocketMessage("WebSocket.Subscribe." + eventType),
            () => new WebSocketMessage("WebSocket.Unsubscribe." + eventType),
            message => (message.type == eventType)
        )
        .retry() // reconnect on error and send subscription messages again
        .share(); // send messages on last/fist un-/subscribe on this stream
    }
    // ...
}

export class WebSocketMessage {
    type: string;
    data: any;
    constructor(command: string, data?:any) {
        this.type = command;
        this.data = data || undefined;
    }
}

我写了以下测试用例,但是失败了......

it('should able to handle multiple subscriptions', () => {
      const subject = Observable.webSocket(<any>{url: 'ws://mysocket'});
      const sub1 = subject.subscribe();
      const sub2 = subject.subscribe();

      const socket = MockWebSocket.lastSocket;
      socket.open();

      sinon.spy(socket, 'close');

      sub1.unsubscribe();
      // Fails, because the socket gets closed on first unsubscribe
      expect(socket.close).have.not.been.called;

      sub2.unsubscribe();
      expect(socket.close).have.been.called;
    });

如果我做对了,share运算符就可以了。但在使用运算符后,Multiplex方法不可用。

感谢您的任何反馈,意见......!

0 个答案:

没有答案