亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Socket IO事件多次觸發NodeJS

Socket IO事件多次觸發NodeJS

慕婉清6462132 2022-06-15 10:47:23
我正在使用 socket.IO 在 NodeJS 和 Android 中構建一個測驗應用程序,當我quizzoStatus從服務器發出一個事件時,我遇到了一個問題,該事件第一次觸發一次,第二次觸發兩次,依此類推。在這里我附上我的代碼片段///server side: NodeJSsocket.on('sendQuizzoAnsPoints', async (data)=>{          try {              const obj = JSON.parse(data);              const game = await QuizzoPlayModel.findOne({_id:obj.gameId});              const player = await UserModel.findOne({_id: game.playerId});              const opponent = await UserModel.findOne({_id: game.opponentId});              if(obj.userId == game.opponentId){                  let update = {                      opponentPoints: game.opponentPoints + obj.points || 0,                      opponentWA: game.opponentWA + obj.wrongAns || 0,                  };                  await QuizzoPlayModel.findByIdAndUpdate(obj.gameId, update).lean().exec();                  userNamespace.to(player.socketId).emit('quizzoStatus', {                      fullName: opponent.fullName,                      points: game.playerPoints + obj.points,                      wrongAns: obj.wrongAns,                      gameId: obj.gameId                  });              }              if(obj.userId == game.playerId) {                  let update = {                      playerPoints: game.playerPoints + obj.points || 0,                      playerWA: game.playerWA + obj.wrongAns || 0,                  };                  await QuizzoPlayModel.findByIdAndUpdate(obj.gameId, update).lean().exec();                  userNamespace.to(opponent.socketId).emit('quizzoStatus', {                      fullName: player.fullName,                      points: game.playerPoints+ obj.points,                      wrongAns: obj.wrongAns,                      gameId: obj.gameId                  });              }          } catch (e) {              console.log(e);          }        });在這里,我監聽一個名為的事件sendQuizzoAnsPoints,然后在另一個名為 的事件中向玩家或對手發出一個事件quizzoStatus。
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

問題出在Android. 您每次都在分配新的偵聽器,而不會刪除前一個偵聽器。您需要創建該Emmiter偵聽器的變量,并在工作完成后將其刪除onDestroy或其他地方:


    //variable of Emmiter.Listener

    Emmiter.Listener quizzoStatus = new Emitter.Listener(){

        @Override public void call(Object... args){

            runOnUiThread(new Runnable(){

                @Override public void run(){

                    Log.e("opponet point", opponentPoints + " " + quizzoStatusResponseDto.getPoints());

                }

            });

        }

    };


    //assigning the listener

    socket.on("quizzoStatus", quizzoStatus);

    . . . .

    @Override protected void onDestroy(){

        super.onDestroy();

        //removing the listener...

        socket.off("quizzoStatus", quizzoStatus);

    }

希望這會奏效


查看完整回答
反對 回復 2022-06-15
  • 1 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號