频繁从 socket.io 接收数据时 React 崩溃
React crashing when frequently receiving data from socket.io
我有一个 React 应用程序每 5 秒接收一次数据。服务器处理得很好,但是如果你离开页面再回来或者等待 10 秒左右,页面会变白并且没有响应。
数据包含应用程序更新和显示的信息。
我试过使用异步函数来处理数据,但这没有帮助
socketio 客户端代码:
socket.on('UpdateGames', data => {
const {j, s, e} = JSON.parse(data)
setJoin(j.map(item => new Game(item)))
setSpec(s.map(item => new Game(item)))
setEnd(e.map(item => new Game(item)))
})
编辑:尝试每 10 秒发送一次数据,但同样的事情发生了
Evert 是正确的,我没有进行任何清理。将此添加到我的组件
useEffect(() => {
socket.on('connect', socket => {
console.log('connected')
})
socket.on('UpdateGames', data => {
const {j, s, e} = JSON.parse(data)
console.log("RECEIVE")
setJoin(j.map(item => new Game(item)))
setSpec(s.map(item => new Game(item)))
setEnd(e.map(item => new Game(item)))
})
return () => socket.off('UpdateGames', listener)
}, [])
添加 OP @COOKIE 的答案,我发现
socket.removeAllListeners([eventName])
解决了我的网络应用程序中奇怪的递归循环问题。
我相信这是因为 useEffect 开始累积套接字侦听器,并且随着时间的推移呈指数级增长并导致网络应用程序崩溃。
请参阅下文了解我是如何解决我的问题的:
useEffect(() => {
socket.on(eventName, (res) => {
func(res);
});
return () => socket.removeAllListeners(eventName);
}
}, [func, eventName]);
我有一个 React 应用程序每 5 秒接收一次数据。服务器处理得很好,但是如果你离开页面再回来或者等待 10 秒左右,页面会变白并且没有响应。
数据包含应用程序更新和显示的信息。
我试过使用异步函数来处理数据,但这没有帮助
socketio 客户端代码:
socket.on('UpdateGames', data => {
const {j, s, e} = JSON.parse(data)
setJoin(j.map(item => new Game(item)))
setSpec(s.map(item => new Game(item)))
setEnd(e.map(item => new Game(item)))
})
编辑:尝试每 10 秒发送一次数据,但同样的事情发生了
Evert 是正确的,我没有进行任何清理。将此添加到我的组件
useEffect(() => {
socket.on('connect', socket => {
console.log('connected')
})
socket.on('UpdateGames', data => {
const {j, s, e} = JSON.parse(data)
console.log("RECEIVE")
setJoin(j.map(item => new Game(item)))
setSpec(s.map(item => new Game(item)))
setEnd(e.map(item => new Game(item)))
})
return () => socket.off('UpdateGames', listener)
}, [])
添加 OP @COOKIE 的答案,我发现
socket.removeAllListeners([eventName])
解决了我的网络应用程序中奇怪的递归循环问题。
我相信这是因为 useEffect 开始累积套接字侦听器,并且随着时间的推移呈指数级增长并导致网络应用程序崩溃。
请参阅下文了解我是如何解决我的问题的:
useEffect(() => {
socket.on(eventName, (res) => {
func(res);
});
return () => socket.removeAllListeners(eventName);
}
}, [func, eventName]);