RXJS6 Websocket主题订阅问题与Redux观测值
我正在尝试在React Redux应用程序中建立按需wensocket连接。RxJS提供WebCoketSubject来管理WebCokets。在接收到操作时,我想使用WebCoketSubject启动连接,对于后续的启动WebCokets请求,如果已经建立了连接,我将重用套接字。但当我这样做的时候,一个新的订阅正在我保存在内存中的WebCoketSubject引用中创建,所以每当我从服务器收到消息时,我都会得到重复的操作 下面是代码片段RXJS6 Websocket主题订阅问题与Redux观测值,websocket,rxjs,redux-observable,rxjs6,Websocket,Rxjs,Redux Observable,Rxjs6,我正在尝试在React Redux应用程序中建立按需wensocket连接。RxJS提供WebCoketSubject来管理WebCokets。在接收到操作时,我想使用WebCoketSubject启动连接,对于后续的启动WebCokets请求,如果已经建立了连接,我将重用套接字。但当我这样做的时候,一个新的订阅正在我保存在内存中的WebCoketSubject引用中创建,所以每当我从服务器收到消息时,我都会得到重复的操作 下面是代码片段 import { ofType } from 'redu
import { ofType } from 'redux-observable';
import { delay, mapTo, switchMap, mergeMap, map, skipUntil, skipWhile, takeUntil, catchError, take } from 'rxjs/operators';
import { Observable, DataEvent, WebSocket, of } from 'rxjs';
import { WebSocketSubject } from 'rxjs/webSocket';
let socket;
const getWebSocket = () => {
console.log("socket", socket);
if(socket) {
console.log(socket.closed);
}
if(!socket) {
console.log("creating new socket");
socket = new WebSocketSubject("ws://localhost:9091/web-socket");
}
return socket;
}
//maps a websocket recieved message to redux store types
const websocketMsgMapper = payload => {
return {
type : 'WORKFLOWS_RECEIVED',
workflows : payload.workflows
}
};
export const openSocketEpic = action$ => action$.pipe(
ofType('START_WEBSOCKET'),
mergeMap( action => {
const socket$ = getWebSocket();
console.log(socket$);
return socket$.pipe(
map(websocketMsgMapper),
takeUntil(action$.pipe(ofType('STOP_WEBSOCKET'))),
catchError(error => of({
type : 'WORKFLOWS_RECEIVED_ERROR'
}))
);
})
);