【问题标题】:Update socket.io handshake data when using angular factory使用角度工厂时更新 socket.io 握手数据
【发布时间】:2016-11-15 15:36:41
【问题描述】:

当我将用户重新连接到我的 socket.io 测验应用程序时,我的 angularjs/ionic 应用程序中的握手数据出现了一些问题。

如果用户断开连接然后再次连接,我想在连接到服务器时更新从客户端发送的握手数据。 (我需要一些握手数据,因为服务器会检查用户是第一次加入,还是刚刚失去与测验的连接)

我的问题/现在发生了什么:

  1. 一个用户想要参加 id 为“12345”的测验
  2. 用户连接到我的服务器,发送握手数据:{user_id: 1, quiz_code: 12345}
  3. 然后服务器将用户“1”添加到测验编号“12345”
  4. 当测验结束时,用户使用 io.disconnect() 并离开测验
  5. 用户现在决定加入测验“66666”
  6. 现在套接字工厂似乎记住了旧的握手。
  7. 所以当客户端连接到服务器时它发送{user_id: 1, quiz_code: 12345} 但应该发送{user_id: 1, quiz_code: 66666}

我的 angular.js 控制器

.controller('QuizCtrl', function(SocketService) {

    $scope.$on('$ionicView.enter', function(e) {
        //this seems to be the problem -> it reuses the old data in the factory
        SocketService.connect(); 
    });

    $scope.$on('$ionicView.leave', function(e) {
        SocketService.removeListener();
        SocketService.disconnect();
    });

});

我的 angular.js 套接字工厂

.factory('SocketService', function(socketFactory){

     var data = {
         activeQuiz  : {quiz_code: 12345, quiz_ip: some.ip}, 
         currentUser : {user_id: 1}
     };
     //This data is loaded from localStorage in the application, so it can be changed 

     var myIoSocket = io.connect(data.activeQuiz.ip, {query: 'user_id='+data.currentUser.user_id+'&quiz_code='+data.activeQuiz.quiz_code});

     mySocket = socketFactory({
         ioSocket: myIoSocket
     });

     return mySocket;
})

所以 3 个问题:

  1. 我知道工厂是单例的,但我可以更新工厂中的数据吗?
  2. 当用户进入控制器时,我可以“重新注入”工厂或“重置”工厂吗?
  3. 可能有更好的方法吗?

【问题讨论】:

    标签: angularjs sockets socket.io factory


    【解决方案1】:

    工厂不需要 是单身人士,在你的情况下,我确实建议他们不要这样做。为此,您需要做的就是将您的工厂逻辑包装在一个函数中,如下所示:

    .factory('SocketService', function(socketFactory){
         var init = function() {
             var data = {
                 activeQuiz  : {quiz_code: 12345, quiz_ip: some.ip}, 
                 currentUser : {user_id: 1}
             };
             //This data is loaded from localStorage in the application, so it can be changed 
    
             var myIoSocket = io.connect(data.activeQuiz.ip, {query: 'user_id='+data.currentUser.user_id+'&quiz_code='+data.activeQuiz.quiz_code});
    
             mySocket = socketFactory({
                 ioSocket: myIoSocket
             });
    
             return mySocket;
         }
         return init
    })
    

    这样,您可以在每次要重置工厂时分配$scope.socketService = SocketConnect(),因为您将实例化一个新对象。

    【讨论】:

    • 如果我想使用数据库中的数据插入查询参数怎么办?我正在使用 $http.get 获取数据,但套接字返回值不等待数据加载...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2017-06-22
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多