简体   繁体   English

socket.on 事件在 react.js 中多次触发

[英]socket.on event firing multiple times in react.js

I'm emitting socket event from my sever end point & listen that event on react.js client with socket.on() but i found my socket.on event firing multiple times when emit event.I read many question related this issue on stack overflow but did't succeed.我正在从我的服务器端点发出套接字事件并使用 socket.on() 在 react.js 客户端上监听该事件,但我发现我的 socket.on 事件在发出事件时多次触发。我在堆栈上阅读了许多与此问题相关的问题溢出但没有成功。

Here relavant code:这里相关代码:

server服务器

 currentUsers: async function (req, res, next) {
      try {
          let io = req.app.get("socketio")  // get socketio instance
          const uoid = req.body.uoid;
          const uuid = req.body.uuid || req.decoded.uuid
          const beacon_name = req.body.beacon_name
          if (uuid !== undefined && beacon_name !== undefined && uoid !== undefined) {
              let find = await knex('current_users').where(knex.raw('uuid = ? and uoid = ?', [uuid, uoid])).catch((err) => { return Promise.reject(err) })
              if (find.length == 0) {
                  let result = await knex('current_users').insert({ uuid: uuid, uoid: req.body.uoid, beacon_name: beacon_name, created_at: helper.currentTimeStamp(), in_at: helper.currentTimeStamp(), in: 1,out: 0 }).catch((err) => { return Promise.reject(err) })
                  console.log('result', result)
                  let getResult = await knex('users').select('users.id', 'users.name', 'users.email','users.mobile_number', 'users.auth_type', 'users.uuid', 'users.role','current_users.beacon_name','current_users.id as ob_id','beacons_info.beacon_room','current_users.in_at','current_users.out_at').innerJoin('current_users', 'users.uuid', '=', 'current_users.uuid').innerJoin('outlets','outlets.id','=','current_users.uoid').innerJoin('beacons_info', 'beacons_info.name', '=', 'current_users.beacon_name').where(knex.raw('current_users.id = ?',result))
                     io.emit('in_users',getResult)
                     res.end()
                 }
          }
    } catch (err) {
         console.log("err =====>", err)
    }
}

client客户

    import React from "react";
    import socket from "../../../../utils/socket.io"; // get socket
    import EventEmitter from 'events';
    class CurrentUsers extends React.Component {
       _isMounted = false;
       constructor(props) {
          super(props);
          this.outlet_id = sessionStorage.outlet_id ? sessionStorage.outlet_id : "";
          this.selecteId = null;
          this.in_users = [];
          this.state = {
             loading: true,
             data: [],
             editData: {
                name: "",
                date: "",
                room: ""
             }
          };
       }

       componentDidMount() {
          console.log("calling component did mount");
          this._isMounted = true;
          this.setState({ loading: true });
          socket.emit('request-current-users-list',this.outlet_id)
       }


      componentWillUnmount() {
          this._isMounted = false;
       }

      render() {

          socket.on('get-current-users-list',(data)=>{
             this.setState({ data: data,loading: false})
          })
          console.log(EventEmitter.listenerCount(socket, 'in_users'));

          socket.on('in_users', (data) => {
             console.log("=== in ===", data)
          })
        return (
    // template html code
    );
         }
        }

here socket.on(in_users) event firing multiple times.这里 socket.on(in_users) 事件多次触发。

Somehow it keeps adding the listener each time the socket.on is fired.每次 socket.on 被触发时,它都会以某种方式不断添加侦听器。 I tried this:我试过这个:

socket.off('MY_EVENT').on('MY_EVENT', () => doThisOnlyOnce());

I found it on code grepper, and it worked for me.我在代码grepper上找到了它,它对我有用。

Put all of your socketio listerners in React inside componentDidMount ,将所有 socketio 监听器放在React中的 componentDidMount 中,

Its because re-renders, React re-renders multiple times when ever any state changes ,so basically your socketio listerers just keep adding up.这是因为重新渲染,当任何状态发生变化时,React 都会重新渲染多次,所以基本上你的 socketio 列表器只是不断增加。 That is why you are getting multiple events fired.这就是为什么您会触发多个事件。 You just need to add your socketio listeners once , so add your listeners inside componentDidMount()您只需要添加一次 socketio 侦听器,因此在componentDidMount() 中添加您的侦听器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM