RXJS6 Websocket主题订阅问题与Redux观测值

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

我正在尝试在React Redux应用程序中建立按需wensocket连接。RxJS提供WebCoketSubject来管理WebCokets。在接收到操作时,我想使用WebCoketSubject启动连接,对于后续的启动WebCokets请求,如果已经建立了连接,我将重用套接字。但当我这样做的时候,一个新的订阅正在我保存在内存中的WebCoketSubject引用中创建,所以每当我从服务器收到消息时,我都会得到重复的操作

下面是代码片段

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'
                }))
        );
    })
    );