簡體   English   中英

服務器中的Redux + socket.io-業務邏輯是否屬於事件偵聽器或動作創建者?

[英]Redux + socket.io in the server - Does business logic belong in event listeners or action creators?

我正在實施一個在線多人游戲,它將通過socket.io接收來自客戶端的連接。

我不確定在服務器中處理事件的位置-套接字事件偵聽器本身,還是應該將這種邏輯延遲給動作創建者。

考慮到在許多情況下,從客戶端套接字接收事件將觸發服務器端的.emit.broadcast ,因此我需要在處理此問題的任何函數內部都可以訪問socketio

到目前為止,我的解決方案:

商店創建者:

export default io => createStore(
    combineReducers({
        users,
        tables,
        games
    }),
    applyMiddleware(
        thunk.withExtraArgument(io),
        logger
    )
);

使用io作為額外的thunk參數創建store,以便動作創建者可以io.emit事件,將套接字事件處理程序綁定到storeio以便他們可以dispatchgetStateio.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM