node.js - 如何在触发 useEffect 挂钩之前等待来自 redux 存储的数据?
问题描述
我目前正在开发一个使用 React、Redux 和 Socket.io 的应用程序。当用户登录并进入消息页面时,socket 和 room 会按原样创建。但是,当我单击刷新时,似乎我的 useEffect 函数在从 redux 存储接收数据之前触发,该函数正确设置了套接字和房间。有没有人遇到过这样的问题?如果是这样,你如何解决它?提前致谢
编辑:刚刚尝试使用 setTimeout() 并且仍然产生相同的结果。我很茫然。任何帮助,将不胜感激
这是代码:
import Sidebar from './Sidebar';
import { Container, Col, Row, Card } from 'react-bootstrap';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { receiveMessage } from '../../actions/conversation';
//Socket.IO import
import io from 'socket.io-client';
const Messenger = ({ auth, receiveMessage }) => {
const [socket, setSocket] = useState(null);
const setupSocket = () => {
const id = auth.userNumber;
console.log('fdhsafidhsafkdjsafhdusafhdsafidgsafdusa', id);
if (!socket) {
const newSocket = io('http://localhost:5000', {
query: {
id: id,
},
});
newSocket.on('disconnect', () => {
setSocket(null);
setTimeout(setupSocket, 3000);
});
newSocket.on('receive-message', (message) => {
console.log('socket.io-client message', message);
receiveMessage(message);
});
}
// return () => newSocket.close();
};
useEffect(async () => {
await setupSocket(); <=== Problem is here
}, []);
return (
<div>
<Sidebar />
</div>
);
};
Messenger.propTypes = {
auth: PropTypes.object.isRequired,
receiveMessage: PropTypes.func.isRequired,
};
const mapStateToProps = (state) => ({
auth: state.auth,
});
export default connect(mapStateToProps, { receiveMessage })(Messenger);```
解决方案
事实证明,从本质上讲,套接字在刷新时会被破坏。转到此处了解更多信息:刷新后保持 WebSocket 连接处于活动状态
推荐阅读
- ios - 为不同的目标声明常量
- c++ - 从 C++ 代码通过 PQsendQuery 执行 sql 时 Postgres SQL 解析错误 - SQLState:42601 消息:在“”或附近出现语法错误
- mysql - 如何在单个语句中使用 AND 和 OR
- excel - 批量修改条目电子表格 - excel libreoffice calc
- reactjs - preload.ts 中的 contextBridge.exposeInMainWorld:ipcRenderer 接收到来自 main.ts 的消息,但渲染器没有得到它
- javascript - 根据“喜欢”状态更改 SVG 图标颜色
- c++ - 与 const_cast 相反
- sabre - 如何修复“服务提供者调用失败”错误?
- excel - 更改分组文本框的文本
- php - 如何通过 CHAT-API 向 whats 应用组发送消息