Multi redux store на сервере сокетов узлов

В настоящее время я учусь реагировать и сокращать, и я делаю практический проект, чтобы столкнуться с некоторыми проблемами.

Проект представляет собой многопользовательский лабиринт, поэтому я решил, что использование сервера socket.io, а также этого игрока будет ограничено в контексте игры лабиринта, поэтому я использую комнату (пространство имен io).

Весь игровой контекст хранится в redux на сервере узла и подключается к пользовательскому интерфейсу клиента.

из-за этого у меня есть сервер с несколькими комнатами, мне нужен отдельный магазин для каждой комнаты / игры. Абсолютно я могу комбинировать редукторы, но это означает большую потерю производительности и необходимость в темной архитектуре действия и хранения.

проблема в том, что я не знаю, как создать мульти-магазин на node.js

в настоящее время сервер работает в этом случае -> при подключении клиента -> если текущая комната заполнена, создайте новую игру, иначе назначьте текущую комнату

  public generate = (server:SocketIO.Server) =>{
        let newIDGenetator = new Idgenerator();
        let store = redux.createStore(labActionReducer);
        let room = server.of('/room'+this.labs.length);
        let socketHandler =  new SocketHandler(room,store,newIDGenetator);
        this.labs.push(socketHandler);

this is the fonction call for generate a new game :
-> create idgenerator wich is just an incr who return is value cast in string 
-> create a new store 
-> create a io namespace 
-> create a new socketHandler which  implemente :


room.on('connect' , (client,store) => 
    client.on('foo',()=> 
         store.dispatch({type:bar});
    )
)

и слушайте хранилище, чтобы отправить новое состояние каждому клиенту помещения обработки.

первая комната работает хорошо, но когда создается второй корень, клиент показывает данные о состоянии первой комнаты, когда я пытаюсь получить начальное состояние

Клиент подключается к хорошему пространству имен,

Итак, я полагаю, что createStore не создает новый магазин. Не могли бы вы помочь мне создать новый магазин независимо от первого? Если вам нужна дополнительная информация, я могу дать вам ссылку на проект на gitHub.

Спасибо за чтение :)

изменить: код socketHandler:

export class SocketHandler{
    private playersId = {};
    private store:Store<Lab,LabActionTypes>;
    constructor(server:Namespace,store:Store<Lab,LabActionTypes>,idgenerator:Idgenerator){
        this.store = store;

        store.subscribe(()=>{
            console.info(this.store.getState());
            for(let playerId in this.playersId){
                let newState = this.store.getState() //utiliser reducer_relatif (state,playerId)
                this.playersId[playerId].emit('gridChanged',newState);
             }
        })

        server.on('connect',(client)=>{
            let newID = idgenerator.generetaId()
            this.playersId[newID]=client;
            store.dispatch(action.NewPlayer(newID));
            NewClient(client,store,this);
        });

    }
    public getPlayerBySocket = (socket:SocketIO.Socket)=>{
        for(let playerId in this.playersId){
            if (this.playersId[playerId]===socket){
                return playerId;
            }
        }
    }
}

export const NewClient = (client: SocketIO.Socket,store:redux.Store<Lab,LabActionTypes>,socketHandler:SocketHandler) => {                 


    client.on('up',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveUp(player,store));
        console.info(JSON.stringify(store.getState()));
    })

    client.on('down',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveDown(player,store));
    })

    client.on('left',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveLeft(player,store));
    })

    client.on('right',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveRight(player,store));
    })

Зачем вообще использовать redux? Разве простой объект не сработает? У вас уже есть обработчики событий для событий сокета.

Mario Tacke 03.05.2018 20:25

поскольку цель этого - изучить Redux, мы больше используем «философию» Redux для создания приложения, подразумевающего функциональное программирование, а не объектное программирование и циклический поток данных. Это упражнение позволило мне сравнить функциональное и объектное программирование.

thomas rousse 04.05.2018 10:44

Поскольку ваш проект уже в значительной степени основан на событиях, я хотел бы предупредить, что сокращение может не подходить для этого сценария. Прочтите эту статью от создателя redux, чтобы узнать больше: medium.com/@dan_abramov/you-might-not-need-redux-be46360cf36‌ 7

Mario Tacke 04.05.2018 16:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
161
0

Другие вопросы по теме