[英]Redux + socket.io in the server - Does business logic belong in event listeners or action creators?
我正在實施一個在線多人游戲,它將通過socket.io接收來自客戶端的連接。
我不確定在服務器中處理事件的位置-套接字事件偵聽器本身,還是應該將這種邏輯延遲給動作創建者。
考慮到在許多情況下,從客戶端套接字接收事件將觸發服務器端的.emit
或.broadcast
,因此我需要在處理此問題的任何函數內部都可以訪問socket
和io
。
到目前為止,我的解決方案:
商店創建者:
export default io => createStore(
combineReducers({
users,
tables,
games
}),
applyMiddleware(
thunk.withExtraArgument(io),
logger
)
);
使用io
作為額外的thunk參數創建store,以便動作創建者可以io.emit
事件,將套接字事件處理程序綁定到store
和io
以便他們可以dispatch
, getState
和io.emit
:
let store = createStore(io),
//socket event handlers
boundHandlers = [
tables,
games,
messages
].map(handler => handler(store, io));
io.on('connect', users(store, io, boundHandlers));
我的users
高階函數返回傳入連接的事件處理程序並注冊boundHandlers
聲明的boundHandlers
:
let connections = {};
export default ({dispatch, getState}, io, handlers) => async socket => {
//close sockets with same session id
let sessionId = socket.handshake.session.id;
if(connections[sessionId])
connections[sessionId].disconnect();
connections[sessionId] = socket;
let userId = /** some authentication logic here **/
//bind event handlers to socket
handlers.forEach(handler => handler(socket, userId));
socket
//send initial user state
.emit('init', userId, getUserState(getState(), userId))
/** other stuff **/
}
最后一段代碼是我不確定應該在事件偵聽器還是動作創建器中使用的代碼。
在慣用的redux動作中,創建者應該是純凈的(沒有副作用),這意味着要使他們擺脫異步邏輯。
我編寫了中間件來配置連接並相應地調度操作。
我建議為此檢查眾多庫中的一種。 可以按原樣使用,也可以提供有關如何實現自己的想法的想法。 像socket.io-redux一樣 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.