Socket IO AngularJS(1.x) 工厂注入多次发射

Posted

技术标签:

【中文标题】Socket IO AngularJS(1.x) 工厂注入多次发射【英文标题】:Socket IO AngularJS(1.x) Factory Injection Multiple Emits 【发布时间】:2018-07-11 19:17:31 【问题描述】:

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

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】:

由于某种原因,即使使用“socket.disconnect()”或“socket.destroy()”,客户端的连接也没有中断。

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

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

【讨论】:

以上是关于Socket IO AngularJS(1.x) 工厂注入多次发射的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs 中的 Socket.io

改进这个 AngularJS 工厂以与 socket.io 一起使用

如何使用 Express、AngularJS、Socket.io 广播和获取通知?

Angularjs socket.io 服务

AngularJS 不使用 socket.io 刷新视图

AngularJS:通过 https 使用 socket.io 的聊天应用程序