为什么每当我重新启动控制器时,我的socket.on调用都会成倍增加

Aus*_*vis 2 sockets socket.io angularjs

我一直在使用brian ford这里描述的套接字工厂 http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/

这是工厂myApp.factory('socket',function($ rootScope){

     var socket = io.connect('url');
        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);
                        }
                    });
                })
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

我的控制器初始化函数中有一个socket.emit,每当我从另一个页面重新进入该控制器时,接收socket.on函数执行+1次.这种情况发生在我手动刷新页面然后重置为1.我没有明确地将我的套接字存储在会话中.那么什么可能导致我的socket.on多次调用.

这是我的控制器中的socket.emt总是执行一次.

$scope.init = funciton (){
...
socket.emit('getSignedSlidesFromUrl', $scope.slideLocation);
}
Run Code Online (Sandbox Code Playgroud)

这是我的socket.on将收到'getSignedSlidesFromUrl'

socket.on('signedUrls', function (signedSlides){
            console.log('signedUrls socket hit');
            $scope.slides = signedSlides;
            console.log($scope.slides[0]);
            console.log($scope.display);
        });
Run Code Online (Sandbox Code Playgroud)

以下是重新输入控制器后我的控制台日志的示例

即将从init controllers.js发出getSignedSlidesFromUrl:71

display after called $scope.first slide is0 controllers.js:574
flash object is controllers.js:537
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
Run Code Online (Sandbox Code Playgroud)

如果我再次重新进入控制器,我的日志将更改为

signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823 
Run Code Online (Sandbox Code Playgroud)

小智 7

您必须将removeAllListeners添加到工厂(见下文)并在每个控制器中包含以下代码:

$scope.$on('$destroy', function (event) {
    socket.removeAllListeners();
});
Run Code Online (Sandbox Code Playgroud)

更新套接字工厂:

 var socket = io.connect('url');
    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);
                    }
                });
            })
        },
      removeAllListeners: function (eventName, callback) {
          socket.removeAllListeners(eventName, function() {
              var args = arguments;
              $rootScope.$apply(function () {
                callback.apply(socket, args);
              });
          }); 
      }
    };
});
Run Code Online (Sandbox Code Playgroud)