React Native с Socket.io вызывается несколько раз - PullRequest
0 голосов
/ 21 марта 2020

У меня есть такой компонент, как этот ниже. Я включил socket.io и создал его вне ВНЕШНИХ методов класса и lifecylce (я пытался создать экземпляр socket.io в конструкторе, и казалось, что он повторно подключается каждый раз, когда компонент монтируется, поэтому я переместил его наружу).

КАК ЭТО РАБОТАЕТ:

Когда кнопка нажимается, она вызывает метод onButtonPress, который отправляет на сервер express. js и избыточное хранилище, как показано в коде, и ответ другому клиенту. Получается в конструкторе с помощью socket.on (), как показано ниже:

Примечание: я использую избыточность в своем приложении с создателями действий, и я искал другие ответы, и ни один из них не отвечает на мой случай.

window.navigator.userAgent = 'react-native';
import io from 'socket.io-client/dist/socket.io';
this.socket = io('http://10.0.2.2:5000, {jsonp: false});

class Products extends Component {

  constructor(props){
    super(props)

    socket.on('socSell',(data)=>{
      console.log('The stuff I wanna do after receiving a responce')
    }
  }

  onButtonPress(data){
    this.socket.emit('socSell',data) //call to socket io express server
    this.props.sell(data) //call to redux store(to action creators)
  }

  render(){
     return(
       <Button title='GO' onPress={()=>onButtonPress('mydata')}></Button>
      )

  }

}

Мой сервер Node / Express выглядит следующим образом, и обратите внимание, что я использую socket.broadcast.emit, который отправляет всем клиентам, кроме отправителя.

io.on('connection', (socket)=> {

  socket.on('socSell',(data) => {
    socket.broadcast.emit('socSell',data)
  })

  socket.on('disconnect', ()=>{
    console.log('disconnected')
  }
 }

ПРОБЛЕМА: В моем приложении реакции, если я запускаю приложение в первый раз, оно работает нормально. Но если я скрою приложение (сделаю его неактивным за пределами экрана) и снова активирую его (компонент ie монтируется во второй раз), компонент socket.on () в конструкторе вызывается два раза. Если я прячу / сплю приложение вне экрана и снова активирую его, socket.on () в конструкторе вызывается три раза ... и так далее для 4-го, 5-го и т. Д. c.

Я хочу, чтобы часть socket.on () в ответе в конструкторе вызывалась один раз при нажатии кнопки всегда.

Что я делаю неправильно в приведенном выше коде и как я должен заставить его работать как предполагается?

...