У меня есть требование в приложении, которое я сейчас создаю, для извлечения всех данных через веб-сокет, проблема в том, что нет функции для извлечения всех данных через веб-сокет, и мне нужно выбирать отдельные элементыиз паутины.Это может означать до 100+ событий, отправляемых в веб-сокет при загрузке страницы.
import { webSocketData } from "../actions";
const setupSocket = dispatch => {
const socket = new WebSocket("ws://localhost:8889");
return new Promise((resolve, reject) => {
socket.onopen = () => {
return resolve(socket);
};
socket.onmessage = event => {
const data = JSON.parse(event.data);
dispatch(webSocketData(data));
console.log(data.type);
};
});
};
export default setupSocket;
С кодом выше это означает, что отправлено 100 избыточных действий, что приводит к очень вялой производительности для меня.
Я уверен, что React выполняет повторный рендеринг только при наличии новых данных, проблема в том, что новые данные доступны 100 раз в соответствии с 100 отправляемыми событиями.
Я используюRedux-сага для управления побочными эффектами в этом приложении.После загрузки страницы я отправляю действие FETCH_EVENT_DATA
, может быть, 100 раз для каждого события на странице (100).Нельзя лениво загружать или разбивать на страницы, так как все они должны быть видны сразу.
const fetchEventData = function* fetchEventData(params) {
yield takeEvery("FETCH_EVENT_DATA", action => {
params.socket.send(
JSON.stringify({ type: "getEvent", id: parseInt(action.data) })
);
});
};
Это приводит к тому, что webSocketData(data)
отправляется 100 раз, и в результате постепенно на странице появляется 100 событий при отправке каждого действия webSocketData(data)
.
В идеале я бы хотелУ меня есть событие websocket, которое я могу отправить, под названием getAllEvents
, но это не так.Может кто-нибудь предложить решение, чтобы дождаться возвращения всех запросов, прежде чем я отправлю действие, или, может быть, даже другое решение, о котором я не думал?