RxJS socket.io重新连接retryWhen()

时间:2016-10-19 20:33:46

标签: sockets websocket socket.io rxjs rxjs5

我正在尝试在socket.io断开连接时重新订阅套接字事件 - >使用RxJS重新连接。

以下是我迄今为止的简化版本。我用一个Observable包装socket.io,它被另一个过滤所有套接字事件的Observable包装。我想在套接字重新连接后使用retryWhen并且不确定如何完成此操作...

有人能指出我正确的方向吗?

function socket() {
    return Observable.create(subscriber => {
        let socket = io('my_socket_path');
        let _onevent = socket.onevent;

        socket.onevent = (packet) => {
            subscriber.next(packet);
            _onevent.call(socket, packet);
        };

        socket.on('disconnect', (data) => {
            subscriber.error(data);
        });

        return () => {
            socket.close();
        };
    }).share();
}
function getSocketEvent(event) {
    const socket = socket();
    return Observable.create(subscriber => {
        const eventSubscription = socket
            .filter(packet => packet.data[0] === event)
            .subscribe(packet => {
                subscriber.next(packet);
            });

        return () => {
            eventSubscription.unsubscribe();
        };
    }).share()
      .retryWhen(
       //Not sure how to trigger re-subscription here when socket reconnects
    ));
}
getSocketEvent('myGreatEvent').subscribe(data => {
    console.log(data);
});

感谢您

更新

我注意到当我在套接字的订阅中传递订阅者时会调用retryWhen(),如下所示:

...
 const eventSubscription = socket
        .filter(packet => packet.data[0] === event)
        .subscribe(subscriber); //now triggers retryWhen()...
...

即使有了这个新发现,我也不确定为什么只是传递订阅者触发retryWhen,以及如何在socket重新联机时重新订阅。

1 个答案:

答案 0 :(得分:1)

作为一个新手,我发现了我的问题并回答了我自己的问题以防万一...

事实证明这很简单,我需要传递订阅中的所有处理程序。

.subscribe(
   (packet) => subscriber.next(packet),
   (error) => subscriber.error(error),
   () => console.log('completed')
);