以下代码将关闭连接,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方法不可用。
感谢您的任何反馈,意见......!