【问题标题】:Socket.io emit fires twiceSocket.io 发出两次火灾
【发布时间】:2016-08-01 02:44:49
【问题描述】:

我在我的 Node.js 后端设置了一个 socket.io,它会发出某些事件,然后 AngularJS 会捕获并显示错误并更改一些 $rootScope 变量。我有一个问题,每次给我两个通知时,这个发射似乎都会触发两次,我不知道问题出在哪里

server.js (shortened)

var socket = require('socket.io');
var app = express();

var router = express.Router();
app.use('/api', router);

var server = app.listen(config.conn_port, function(){
    console.log("Server launched at port " + config.conn_port);
});

var io = socket.listen(server);

require('./api/routes')(router, connection, io);

routes.js

module.exports = function(router, connection, socket) {
    # Net event
    client.on('error', function () {
        socket.emit('serverDisconnected', {message: 'Connection ended', server_conn: false});
   });
}

app.js (AngularJS)

app.factory('socket', function ($rootScope) {
  var socket = io.connect();
  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);
          }
        });
      })
    }
  };
});

AngularJS Controller

dashboardModule.controller('dashboardMain', function ($scope, $http, $rootScope, Notification, socket) {
    socket.on('serverDisconnected', function (message) {
        Notification.error(message.message);
    });
});

【问题讨论】:

    标签: javascript angularjs node.js sockets


    【解决方案1】:

    嗯,答案是将 AngularJS socket.on() 移动到服务而不是控制器。控制器被调用两次,导致重复触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2014-10-11
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多