我正在尝试在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重新联机时重新订阅。
答案 0 :(得分:1)
作为一个新手,我发现了我的问题并回答了我自己的问题以防万一...
事实证明这很简单,我需要传递订阅中的所有处理程序。
.subscribe(
(packet) => subscriber.next(packet),
(error) => subscriber.error(error),
() => console.log('completed')
);