简体   繁体   English

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

[英]Why do my socket.on calls multiply whenever i recenter my controller

I've been using the socket factory described here by the brian ford here http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/ 我一直在使用brian ford这里描述的套接字工厂http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/

here is the factory myApp.factory('socket', function ($rootScope) { 这是工厂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);
                        }
                    });
                })
            }
        };
    });

I have a socket.emit in my controllers initialization function and whenever i reenter this controller from another page the receiving socket.on function executes +1 times. 我的控制器初始化函数中有一个socket.emit,每当我从另一个页面重新进入该控制器时,接收socket.on函数执行+1次。 This happens until I manually refresh the page then it resets to 1. I don't explicitly store my socket in session. 这种情况发生在我手动刷新页面然后重置为1.我没有明确地将我的套接字存储在会话中。 So what could be causing my socket.on to call multiple times. 那么什么可能导致我的socket.on多次调用。

Here is my socket.emt in my controller this always executes once. 这是我的控制器中的socket.emt总是执行一次。

$scope.init = funciton (){
...
socket.emit('getSignedSlidesFromUrl', $scope.slideLocation);
}

Here is my socket.on that will be recieve 'getSignedSlidesFromUrl' 这是我的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);
        });

Here is an example of my console log after reentering the controller 以下是重新输入控制器后我的控制台日志的示例

about to emit getSignedSlidesFromUrl from init controllers.js:71 即将从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

if I reenter the controller again my log would change to 如果我再次重新进入控制器,我的日志将更改为

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 

You have to add removeAllListeners to your factory (see below) and have the following code in each of your controllers: 您必须将removeAllListeners添加到工厂(见下文)并在每个控制器中包含以下代码:

$scope.$on('$destroy', function (event) {
    socket.removeAllListeners();
});

Updated socket factory: 更新套接字工厂:

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

I tried @michaeljoser's solution, but it didn't work for me. 我尝试了@ michaeljoser的解决方案,但它对我不起作用。

Then I found another solution and it worked 然后我找到了另一个解决方案并且它有效

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);
                    }
                });
            })
        },
        getSocket: function(){ 
            return socket;
        }
    };
});

And in controller, I called 在控制器中,我打电话给

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM