2015-12-05 29 views
1

我刚开始拾取socket.io。我试图在angular.js中使用它,一切正常。然而,它一直返回多次为什么socket.io为事件返回多次

我controller.js

socketio.emit('GameOver',$scope.currentPlayer.Name); 
     socketio.on('GameOverEmit',function(data){ 
     if(data === $rootScope.user.user_name){ 
      var result = { 
      opponent : rdyplayers.user_name, 
      result : "won" 
      }; 
      // keep getting multiple result 
      console.log(result); 
     }else{ 
      var result = { 
      opponent : rdyplayers.user_name, 
      result : "lose" 
      }; 
      // keep getting multiple result 
      console.log(result); 
     } 
     }); 

在我server.js

io.sockets.on('connection', function (client) { 
​ 
      client.user_name = user.user_name; 
​ 
      //Useful to know when someone connects 
      console.log('\t socket.io:: player ' + client.user_name + ' connected'); 
      // playerturn 
      client.on('PlayerTurn',function(data){ 
       io.emit('PlayerTurnEmit',data); 
​ 
      }); 
      // game over 
      client.on('GameOver',function(data){ 
       io.emit('GameOverEmit',data); 
​ 
      }); 
      // button disabled 
      client.on('PlayerButtonDisabled',function(data){ 
       io.emit('PlayerButtonDisabledEmit',data); 
      }); 
       //When this client disconnects 
      client.on('disconnect', function() { 
        //Useful to know when someone disconnects 
       console.log('\t socket.io:: client disconnected ' + client.user_name); 
       io.emit("disconnected",client.user_name); 
      }); //client.on disconnect 
​ 
     }); //io.sockets.on connection 

我使用socket.io以正确的方式?为了将数据广播给每个人,我只需将数据传递到emit,并通过使用on将数据广播到服务器,并将数据传递回前端?

回答

2

它由controller.js造成,每当我重新访问页面,它将建立一个新的套接字,所以我做的是当用户离开或关闭它会删除所有的选项卡监听器。 我结束了在我的service.js

ttt.factory('socketio', ['$rootScope', function ($rootScope) { 
    'use strict'; 

    var socket = io.connect(); 
    return { 
     on: function (eventName, callback) { 
      socket.on(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        callback.apply(socket, args); 
       }); 
      }); 
     }, 
     emit: function (eventName, data, callback) { 
      socket.emit(eventName, data, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        if (callback) { 
         callback.apply(socket, args); 
        } 
       }); 
      }); 
     }, 
     getSocket: function() { 
     return socket; 
     } 

    }; 
}]); 

加入getsocket在我controller.js解决它,我就

$scope.$on('$destroy', function (event) { 
    socketio.getSocket().removeAllListeners(); 
}); 
+1

非常感谢,这也解决了我的问题。 –

+0

@ Love-Kesh很高兴它有帮助!人民币,以upvote的问题或答案! –

+1

@JohnLim你真棒!从过去两天开始研究这个问题。尝试了很多东西。最后这个工作。 – srbhbarot

3

对于广播使用socket.broadcast.emit()

我没有找到任何插座断开听事件代码在您的客户端代码..尝试添加socketio.disconnect断开连接的客户端

而且还添加了一个侦听器插座断开发射事件从服务器到客户端..在客户端通过添加socketio.on('disconnect', function(){do something})

+0

嗨阿里,我不加入一个断开连接客户端看将帮助我解决问题,但我感谢您指出了这一点。 –

+0

嘿@JohnLim能否请你详细说明你的问题..有多少次不停地回来? – Ali

相关问题