在哪里存储类实例以在 Redux 中重用?

IT技术 reactjs redux redux-saga
2021-05-03 13:39:46

我正在尝试在我的 React/Redux/redux saga 应用程序中通过 Pusher 实现一个消息传递库 Chatkit,我是 Redux 的新手。连接到 chatkit 的代码如下所示:

const chatManager = new ChatManager({
    instanceLocator: 'v1:us1:80215247-1df3-4956-8ba8-9744ffd12161',
    userId: 'sarah',
    tokenProvider: new TokenProvider({ url: 'your.auth.url' })
})

chatManager.connect()
    .then(currentUser => {
        console.log('Successful connection', currentUser)
    })
    .catch(err => {
        console.log('Error on connection', err)
    })

我需要全局存储 chatManager 和 currentUser 对象(它们是具有附加功能的复杂类的实例),以便稍后我可以再次使用它们来加入房间、订阅事件等。

我的第一个想法是我应该将它存储在 Redux 中,因为它现在是我的“全局存储”,但后来我意识到它可能无法工作,因为它不是我从存储中取回的原始对象,它会估计是克隆人。然后我读到显然只有普通对象应该存储在 Redux 中。

那么,不是普通对象但需要全局存储的东西在哪里?我不想将它们放在 window 对象上,因为我可能会将其转换为 React Native 应用程序,无论如何它看起来很混乱。

1个回答

根据有关存储“连接”类型对象Redux FAQ 条目

中间件是 Redux 应用程序中 websockets 等持久连接的正确位置,原因如下:

  • 中间件在应用程序的生命周期内一直存在
  • 与商店本身一样,您可能只需要整个应用程序都可以使用的给定连接的单个实例
  • 中间件可以看到所有已调度的动作和自己的调度动作。这意味着中间件可以采取分派动作并将其转换为通过 websocket 发送的消息,并在通过 websocket 接收到消息时分派新动作。
  • websocket 连接实例不可序列化,因此它不属于商店状态本身

编辑

这是我的“示例套接字中间件”示例,更新为延迟创建套接字,直到它看到登录操作:

const createMySocketMiddleware = (url) => {
    let socket;

    return storeAPI => next => action => {
        switch(action.type) {
            case "LOGIN" : {
                socket = createMyWebsocket(url);

                socket.on("message", (message) => {
                    storeAPI.dispatch({
                        type : "SOCKET_MESSAGE_RECEIVED",
                        payload : message
                    });
                });
                break;
            }
            case "SEND_WEBSOCKET_MESSAGE": {
                socket.send(action.payload);
                return;
            }
        }

        return next(action);
    }
}