В настоящее время я учусь реагировать и сокращать, и я делаю практический проект, чтобы столкнуться с некоторыми проблемами.
Проект представляет собой многопользовательский лабиринт, поэтому я решил, что использование сервера 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, мы больше используем «философию» Redux для создания приложения, подразумевающего функциональное программирование, а не объектное программирование и циклический поток данных. Это упражнение позволило мне сравнить функциональное и объектное программирование.
Поскольку ваш проект уже в значительной степени основан на событиях, я хотел бы предупредить, что сокращение может не подходить для этого сценария. Прочтите эту статью от создателя redux, чтобы узнать больше: medium.com/@dan_abramov/you-might-not-need-redux-be46360cf36 7





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