【问题标题】:Angular-socket-io: how to disconnect the clientAngular-socket-io:如何断开客户端
【发布时间】:2014-03-07 16:40:22
【问题描述】:

更新

现在方法socket.disconnect(close) has been included in angular-socket-io。它有一个布尔参数'close',如果为真,也关闭底层连接。


我正在使用 btford/angular-socket-io

断开客户端的正确方法是什么?

我正在尝试实现以下场景

  1. 用户登录 --> 连接到套接字
  2. 用户注销 --> 从套接字断开
  3. 重复 (1) (2)

我成功实现了连接 (1),但我在断开连接时遇到了问题 (2)

这是我尝试过的:在我的身份验证服务中,我有以下内容

factory('AuthenticationService', function(socketFactory) {
  var mySocket;
  var service = {
      //...
      login: function(credentials) {
          var login = $http.post('/login', credentials);
          return login.then(function(response) {
            service.currentUser = response.data.user;
            if ( service.isAuthenticated() ) {
                // **connect to socket on login** 
                mySocket = socketFactory({ioSocket: io.connect('http://localhost')}); 
            }
            return service.isAuthenticated();
          });       
      },

      logout: function(redirectTo) {
          var logout = $http.get('/logout');
          logout.success(function() {
            service.currentUser = null;
            mySocket.disconnect();       // **disconnect on logout (not working)**
            redirect(redirectTo);
          });
          return logout;
      },
      //...
  };
  return service;
})

mySocket.disconnect();
给出以下错误 TypeError: Object # has no method 'disconnect'

mySocket.disconnect() 可以代替

mySocket = socketFactory({ioSocket: io.connect('http://localhost')});

我用

mySocket = io.connect('http://localhost'); 

【问题讨论】:

    标签: javascript angularjs socket.io


    【解决方案1】:

    您的代码看起来正确。我认为问题是变量提升,mySocket 是提升。 阅读here

    【讨论】:

    • 坦克,但吊装应该没问题,mySocket 只在服务开始时声明一次。此外,如果我不使用 socketFactory,它也可以工作。
    【解决方案2】:

    我的理解是btford/angular-socket-io将socket实例包装在socketFactory中 但不公开 disconnet() 方法 因此它不能用于从客户端断开套接字。

    【讨论】:

      【解决方案3】:

      其实解决方法很简单:

      从 Btford angular-socket 模块编辑“socket.js”文件,你会看到:

      var wrappedSocket = {
      
                on: addListener,
      
                addListener: addListener,
      
      
      
                emit: function (eventName, data, callback) {
      
                  return socket.emit(eventName, data, asyncAngularify(socket, callback));
      
                },    
      
      
                removeListener: function () {
      
                  return socket.removeListener.apply(socket, arguments);
      
                },
      
      
      
                // when socket.on('someEvent', fn (data) { ... }),
      
                // call scope.$broadcast('someEvent', data)
      
                forward: function (events, scope) {
      
                  if (events instanceof Array === false) {
      
                    events = [events];
      
                  }
      
                  if (!scope) {
      
                    scope = defaultScope;
      
                  }
      
                  events.forEach(function (eventName) {
      
                    var prefixedEvent = prefix + eventName;
      
                    var forwardBroadcast = asyncAngularify(socket, function (data) {
      
                      scope.$broadcast(prefixedEvent, data);
      
                    });
      
                    scope.$on('$destroy', function () {
      
                      socket.removeListener(eventName, forwardBroadcast);
      
                    });
      
                    socket.on(eventName, forwardBroadcast);
      
                  });
      
                }
      
              };
      

      然后您只需将其添加到其他功能旁边:

      disconnect: function(){
      
                      return socket.disconnect();
      
                    },
      

      瞧,你去吧:)

      你应该有类似的东西:

      var wrappedSocket = {
      
                on: addListener,
      
                addListener: addListener,
      
      
      
                emit: function (eventName, data, callback) {
      
                  return socket.emit(eventName, data, asyncAngularify(socket, callback));
      
                },
      
      
      
                disconnect: function(){
      
                  return socket.disconnect();
      
                },
      
      
      
                removeListener: function () {
      
                  return socket.removeListener.apply(socket, arguments);
      
                },
      
      
      
                // when socket.on('someEvent', fn (data) { ... }),
      
                // call scope.$broadcast('someEvent', data)
      
                forward: function (events, scope) {
      
                  if (events instanceof Array === false) {
      
                    events = [events];
      
                  }
      
                  if (!scope) {
      
                    scope = defaultScope;
      
                  }
      
                  events.forEach(function (eventName) {
      
                    var prefixedEvent = prefix + eventName;
      
                    var forwardBroadcast = asyncAngularify(socket, function (data) {
      
                      scope.$broadcast(prefixedEvent, data);
      
                    });
      
                    scope.$on('$destroy', function () {
      
                      socket.removeListener(eventName, forwardBroadcast);
      
                    });
      
                    socket.on(eventName, forwardBroadcast);
      
                  });
      
                }
      
              };
      

      【讨论】:

      • 是的,现在 socket.disconnect(close) 已包含在 angular-socket-io 中。 github.com/btford/angular-socket-io/issues/45。它有一个布尔参数'close',如果true,则关闭底层连接。我在你的答案中添加了参数。
      【解决方案4】:

      只需调用 RsocketClient.close() 方法即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多