ReactJs масштабирует сообщения Websocket - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время я работаю над приложением ReactJs, которое получает сообщения от серверной части nodejs со скоростью около 100 сообщений в секунду.Когда я масштабирую сообщения примерно до 10 секунд, мои таблицы отображаются нормально и обновляются, как они должны.Однако, когда для него установлено 100 сообщений, приложение не может отобразить.

Вот мой компонент таблицы, который устанавливает соединение с веб-сокетом и прослушивает сообщения

const ws = new WebSocket("ws://localhost:7770");

class SortedTable extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [],
      sortedInfo: {
        order: 'descend',
        columnKey: 'value',
      }
    };
  }

  //Handle socket setup
  componentDidMount = () => {
    ws.onopen = () => {
      ws.send('init');
    };
    ws.onmessage = (e) => {
      let message = null;
      try {
        message = JSON.parse(e.data);
      } catch (e) {
        console.log('malformed message');
      }
      if (message) {
        let seenIdFlag = false;
        message.key = message.id;
        this.state.data.map((elem, i) => {
          if (elem.id === message.id) {

            //Updating row based on incoming socket message
            const updatedRows = this.state.data.slice();
            updatedRows[i].name = message.name;
            updatedRows[i].value = message.value;
            this.setState({ data: updatedRows });
            seenIdFlag = true;
          }
        });

        //Populating initial data list with unique IDs
        if (this.state.data.length <= 99 && seenIdFlag === false) {
          this.setState({ data: this.state.data.concat([message]) });
        }
      }
    };
  }

  //Destroy socket connection
  componentWillUnmount = () => {
    ws.onclose = () => {
      ws.send('close');
    };
  }

А вот мой рендерmethod

render() {
let { sortedInfo } = this.state;
const columns = [
  {
    title: "Id",
    dataIndex: "id",
    key: "id"
  },
  {
    title: "Value",
    dataIndex: "value",
    key: "value",
    sorter: (a, b) => a.value - b.value,
    sortOrder: sortedInfo.columnKey === 'value' && sortedInfo.order,
  },
  {
    title: "Name",
    dataIndex: "name",
    key: "name"
  }
];

return (
  <div className="table-sorting">
    <Table columns={columns} dataSource={this.state.data} pagination={false} size="small" />
  </div>
);

}

Я делаю что-то по своей сути неправильно, что вызывает проблемы с производительностью при работе с установкой состояния сотни раз в секунду?Как вы можете видеть, я имею дело с заполнением таблицы, проверяя, был ли идентификатор определенного элемента перенесен в таблицу или нет, и как только таблица содержит 100 элементов, я проверяю, разделяет ли новое входящее сообщение какой-либо объектв моем массиве объектов состояния, а затем обновите этот элемент и установите состояние.

Является ли установка состояния, которое много раз в функции onmessage, является плохой практикой?Любая идея будет принята с благодарностью.

Просто повторяю, компонент работает нормально с 10 сообщениями в секунду, и мой компонент обновляет данные так, как должен, он только аварийно завершает работу и не обновляется при масштабировании до 100 сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...