1

我正在将具有多个状态(路由)的 Angular JS 应用程序与在后端运行的节点服务器(套接字)连接起来。当我访问其他状态并返回到编写套接字代码的状态时,它会再次被注册,并且当事件触发时,函数会被多次调用,这会影响性能。

 var socket = io.connect('127.0.0.1:3000');

        socket.on("connect",function(){
          console.log("connected");
        });


          socket.on("test-channel:App\\Events\\NewMessage", function(message) {
              if (vm.questions.length < 3) {

                  console.log("question fetching started");
                  vm.fetch_q();

              }
          });

我尝试将 io.connect('localhost') 也放入服务中,并且只将事件放入控制器中,但随后它也被多次触发。

4

1 回答 1

0

问题是您的控制器每次访问该控制器时都会设置“on”事件,并且它不会仅在刷新时将其删除。

如果您使用 AngularJS,您可以$rootScope.socket = io.connect('127.0.0.1:3000');像这样简单地声明然后在控制器中使用它,$rootScope.socket.emit('event', {});当您想监听事件但使用oninsted of时使用相同的方法emit

无论如何,这是一种提高性能和开发程序方式的方法,但是您的问题仍然存在,因为将事件侦听器保留在控制器中并不是很好——只有当您发出某些东西时。

您可以使用 AngularJS Run 服务中的事件侦听器来解决问题。

app.run(function($rootScope){
  $rootScope.socket.on('event', function(){
    // Do something..
  });
}

如果您有更多事件要监听,您可以在模块中声明事件,然后要求该模块处于run服务状态。希望能给你一个好的解决方案。

于 2018-01-13T14:12:23.563 回答