文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
用 Redux 监听器传播 State
我们现在拥有了一个 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论