返回介绍

用 Redux 监听器传播 State

发布于 2025-02-17 12:51:31 字数 1484 浏览 0 评论 0 收藏 0

我们现在拥有了一个 Socket.io 服务,也建立了 Redux 状态容器,但它们并没有整合在一起,这就是我们接下来要做的事儿。

我们的服务端需要让客户端知道当前的应用状态(例如:“正在投票的项目是什么?”,“当前的票数是什么?”,
“已经出来结果了吗?”)。这些都可以通过每当变化发生时 触发 Socket.io 事件 来实现。

我们如何得知什么时候发生变化?Redux 对此提供了方案:你可以订阅 Redux Store。这样每当 store 指派了 action 之后,在可能发生变化前
会调用你提供的指定回调函数。

我们要修改一下 startServer 实现,我们先来调整一下 index.js:

//index.js

import makeStore from './src/store';
import {startServer} from './src/server';

export const store = makeStore();
startServer(store);

接下来我们只需监听 store 的状态,并把它序列化后用 socket.io 事件传播给所有处于连接状态的客户端。

//src/server.js

import Server from 'socket.io';

export function startServer(store) {
  const io = new Server().attach(8090);

  store.subscribe(
    () => io.emit('state', store.getState().toJS())
  );
}

目前我们的做法是一旦状态有改变,就发送整个 state 给所有客户端,很容易想到这非常不友好,产生大量流量
损耗,更好的做法是只传递改变的 state 片段,但我们为了简单,在这个例子中就先这么实现吧。

除了状态发生变化时发送状态数据外,每当新客户端连接服务器端时也应该直接发送当前的状态给该客户端。

我们可以通过监听 Socket.io 的 connection 事件来实现上述需求:

//src/server.js

import Server from 'socket.io';

export function startServer(store) {
  const io = new Server().attach(8090);

  store.subscribe(
    () => io.emit('state', store.getState().toJS())
  );

  io.on('connection', (socket) => {
    socket.emit('state', store.getState().toJS());
  });
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文