Как исправить утечку памяти при реагировании на собственный прослушиватель событий с помощью функции обратного вызова - PullRequest
0 голосов
/ 25 июня 2019

Я получаю следующую ошибку при вызове функции обратного вызова для прослушивателя событий, который я зарегистрировал: «Предупреждение: не удается выполнить обновление состояния React на неустановленном компоненте. Это неоперация, но это указывает на утечку памяти в вашем приложении ... и т. д. "
Если вы ссылаетесь на код, оператор журнала «Проверка конфигурации» вызывается дважды при вызове функции обратного вызова. В частности, он регистрирует «проверить конфигурацию», затем обновление установленного состояния приводит к приведенному выше предупреждению, а затем снова регистрирует «проверить конфигурацию». Тем не менее, из моих операторов журнала я точно знаю, что прослушиватель событий запускается только один раз.

Следующая, но похожая проблема, в функции reloadData я регистрирую другого слушателя событий, чтобы получать уведомления, когда процесс Bluetooth завершен, и вызывать определенную функцию после каждого ответа. Однако из-за этой утечки памяти функции вызываются несколько раз, поэтому я получаю затопленную очередь из нескольких вызовов.

Я вставил соответствующий код ниже. Я искал решение в течение некоторого времени и не могу найти его. Любые предложения / помощь будут оценены. Если мое описание сбивает с толку, я могу попытаться объяснить дальше.

sync = async() => {
  // other relevant async code
  device.sendConfiguration()
  EventRegister.addEventListener('synccomplete', this.verifyConfiguration)
}

verifyConfiguration = async() => {
  const {device, configuration} = this.props
  const {apiClient} = this.state

  console.log('Verify Configuration')

  EventRegister.removeEventListener('synccomplete')

  this.setState({progressText: 'Verifying configuration', progress: 0.60, syncStage: 2})

  const responseStatus = await apiClient.verifyDeviceConfiguration(configuration, esn)

  if (responseStatus === 204) {
    this.reloadData()
  } else {
    // display issue
  }
}

reloadData = async() => {
  const {device} = this.props

  this.setState({progressText: 'Reloading data', progress: 0.80})
  device.getInfo()
  // device will send respective responses for each fxn
  EventRegister.addEventListener('reloadComplete', async(cmd) => {
    switch (cmd) {
      case 'resp1':
        device.getInfo_2()
        break
      case 'resp2':
        device.getInfo_3()
        break
      case 'resp3':
        device.getInfo_4()
        break
      default: break
    }
  })
}

Как описано выше, я получу очередь, которая будет выглядеть примерно так: [getInfo (), getInfo (), getInfo_2 (), getInfo_2 (), getInfo_2 (), getInfo_2 (), getInfo_3 (), getInfo_3 () и т. д. ...]

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

Спасибо.

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