Redux блокировка при больших объемах событий веб-сокетов - PullRequest
3 голосов
/ 10 апреля 2019

У меня есть требование в приложении, которое я сейчас создаю, для извлечения всех данных через веб-сокет, проблема в том, что нет функции для извлечения всех данных через веб-сокет, и мне нужно выбирать отдельные элементыиз паутины.Это может означать до 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, но это не так.Может кто-нибудь предложить решение, чтобы дождаться возвращения всех запросов, прежде чем я отправлю действие, или, может быть, даже другое решение, о котором я не думал?

...