Ваши ответы сокетов основаны на обратном вызове.Таким образом, есть два подхода к решению этого.Либо обещайте ваши обратные вызовы, либо передайте обратный вызов (функцию) от компонента, который установит состояние с новыми данными.Я объясню два подхода ниже
Обещающий подход
SocketIOClient.js
import io from 'socket.io-client'
const socket = io.connect(`${process.env.REACT_APP_SERVER_URL}`)
export const studentFunction = (studentID) => {
return new Promise((resolve) => {
socket.on('returnedStudentDetails', data => {
resolve(data);
});
socket.emit('getStudentDetails', { studentID });
});
};
Container.js
import { studentFunction } from 'SocketIOClient';
export default class Container extends Component {
constructor(props) {
super(props);
this.state = {
studentDetails: '',
}
}
componentDidMount() {
const studentDetails = await studentFunction(1);
this.setState({ studentDetails });
}
render() {
const { studentDetails } = this.state;
return (
<div>{studentDetails}</div>
);
}
}
Обратный вызов
SocketIOClient.js
import io from 'socket.io-client'
const socket = io.connect(`${process.env.REACT_APP_SERVER_URL}`)
export const studentFunction = (studentID, callback) => {
socket.emit('getStudentDetails', { studentID })
socket.on('returnedStudentDetails', callback)
}
Container.js
import { studentFunction } from 'SocketIOClient';
export default class Container extends Component {
constructor(props) {
super(props);
this.state = {
studentDetails: '',
}
studentFunction(1, this.onLoadStudentData);
}
onLoadStudentData = (studentDetails) => this.setState({ studentDetails })
render() {
const { studentDetails } = this.state;
return (
<div>{studentDetails}</div>
);
}
}