套接字IO AngularJS(1.x)工厂注入多个发射

时间:2018-02-01 12:50:01

标签: javascript angularjs websocket socket.io

在我的服务器端,我使用以下工厂在控制器之间刷新/发出数据:

angularApp.factory('socket', function ($rootScope) {
    var socket = io;

    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);
                    }
                });
            });
        }
    };
});

我从另一个控制器向此(MainController)发出信号以开始向连接的客户端传输数据

$scope.$on('beginDataTransfer', function() {
   socket.emit('dataTransfer', "SOME DATA");
}

问题是如果我没有检查" socket.connected == true"它会在客户端重新连接时多次发出数据。 根据我的理解,当用户因某种原因断开连接时,套接字不会被销毁。

我试着检查插座是否在工厂连接回来但它似乎不起作用:

on: function (eventName, callback) {
    if(socket.connected){
    socket.on(eventName, function () {
        var args = arguments;
        $rootScope.$apply(function () {
            callback.apply(socket, args);
        });
    });
}

},

它发出的次数是用户重新连接的次数。

删除套接字如果断开连接会导致问题超出$ scope。$ on(){},即便如此,它仍然会多次发出。

delete socket;
socket = null;

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

由于某种原因,事实证明即使使用“socket.disconnect()”或“socket.destroy()”,客户端的连接也不会消失。

但使用“ONCE”解决了这个问题。

socket.**once**(eventName, function () {
   var args = arguments;
   rootScope.$apply(function () {
      callback.apply(socket, args);
   });
});