Клиент Socket.io: отвечать на все события одним обработчиком?


21 принят

Похоже, что библиотека socket.io хранит их в словаре. Таким образом, не думайте, что это будет возможно без изменения источника.

Из источника :

EventEmitter.prototype.on = function (name, fn) {
    if (!this.$events) {
      this.$events = {};
    }

    if (!this.$events[name]) {
      this.$events[name] = fn;
    } else if (io.util.isArray(this.$events[name])) {
      this.$events[name].push(fn);
    } else {
      this.$events[name] = [this.$events[name], fn];
    }

    return this;
  };

53

Обновленное решение для socket.io-client 1.3.7

var onevent = socket.onevent;
socket.onevent = function (packet) {
    var args = packet.data || [];
    onevent.call (this, packet);    // original call
    packet.data = ["*"].concat(args);
    onevent.call(this, packet);      // additional call to catch-all
};

Используйте следующее:

socket.on("*",function(event,data) {
    console.log(event);
    console.log(data);
});

Ни один из ответов не работал для меня, хотя близ Матиаса Хопфа и Мароша Пиксела, это моя скорректированная версия.

ПРИМЕЧАНИЕ. Это только ловит пользовательские события, а не var io = require ('socket.io') (); var middleware = require ('socketio-wildcard') (); io.use (промежуточный); io.on ('connection', function (socket) {socket.on ('*', function () {/ * a € | * /});}); io.listen (8000); / var socket = io.connect (); var globalEvent = "*"; socket. $ emit = function (name) {if (! this. $ events) возвращает false; for (var i = 0; i <2; ++ i) {if (i == 0 && name == globalEvent) continue; var args = Array.prototype.slice.call (аргументы, 1-i); var handler = this. $ events [i == 0? name: globalEvent]; if (! handler) handler = []; if ('function' == typeof handler) handler.apply (this, args); else if (io.util.isArray (обработчик)) {var listeners = handler.slice (); для (var i = 0, l = listeners.length; i <l; i ++) слушатели [i] .apply (это, args); } else return false; } return true; }; socket.on (globalEvent, function (event) {var args = Array.prototype.slice.call (аргументы, 1); console.log ("Глобальное событие =" + событие + "; Аргументы =" + JSON.stringify (args) );}); и т.д


15

Наконец , существует модуль под названием socket.io-wildcard, который позволяет использовать подстановочные знаки на стороне клиента и сервера

connecting

10

Ну вот ...

connect

Это позволит отлавливать события , как disconnect, connect, disconnect, reconnectingтоже, так что будьте аккуратнее.


9

Примечание: этот ответ действителен только для socket.io 0.x

Вы можете переопределить сокет. $ Emit

В следующем коде у вас есть две новые функции:

  • Ловушка всех событий
  • Ловушка только события, которые не захвачены старым методом (это прослушиватель по умолчанию)
var original_$emit = socket.$emit;
socket.$emit = function() {
    var args = Array.prototype.slice.call(arguments);
    original_$emit.apply(socket, ['*'].concat(args));
    if(!original_$emit.apply(socket, arguments)) {
        original_$emit.apply(socket, ['default'].concat(args));
    }
}

socket.on('default',function(event, data) {
    console.log('Event not trapped: ' + event + ' - data:' + JSON.stringify(data));
});

socket.on('*',function(event, data) {
    console.log('Event received: ' + event + ' - data:' + JSON.stringify(data));
});
JavaScript, события, socket.io,

javascript,events,socket.io,

64

Ответов: 11


21 принят

Похоже, что библиотека socket.io хранит их в словаре. Таким образом, не думайте, что это будет возможно без изменения источника.

Из источника :

EventEmitter.prototype.on = function (name, fn) {
    if (!this.$events) {
      this.$events = {};
    }

    if (!this.$events[name]) {
      this.$events[name] = fn;
    } else if (io.util.isArray(this.$events[name])) {
      this.$events[name].push(fn);
    } else {
      this.$events[name] = [this.$events[name], fn];
    }

    return this;
  };

53

Обновленное решение для socket.io-client 1.3.7

var onevent = socket.onevent;
socket.onevent = function (packet) {
    var args = packet.data || [];
    onevent.call (this, packet);    // original call
    packet.data = ["*"].concat(args);
    onevent.call(this, packet);      // additional call to catch-all
};

Используйте следующее:

socket.on("*",function(event,data) {
    console.log(event);
    console.log(data);
});

Ни один из ответов не работал для меня, хотя близ Матиаса Хопфа и Мароша Пиксела, это моя скорректированная версия.

ПРИМЕЧАНИЕ. Это только ловит пользовательские события, а не var io = require ('socket.io') (); var middleware = require ('socketio-wildcard') (); io.use (промежуточный); io.on ('connection', function (socket) {socket.on ('*', function () {/ * a € | * /});}); io.listen (8000); / var socket = io.connect (); var globalEvent = "*"; socket. $ emit = function (name) {if (! this. $ events) возвращает false; for (var i = 0; i <2; ++ i) {if (i == 0 && name == globalEvent) continue; var args = Array.prototype.slice.call (аргументы, 1-i); var handler = this. $ events [i == 0? name: globalEvent]; if (! handler) handler = []; if ('function' == typeof handler) handler.apply (this, args); else if (io.util.isArray (обработчик)) {var listeners = handler.slice (); для (var i = 0, l = listeners.length; i <l; i ++) слушатели [i] .apply (это, args); } else return false; } return true; }; socket.on (globalEvent, function (event) {var args = Array.prototype.slice.call (аргументы, 1); console.log ("Глобальное событие =" + событие + "; Аргументы =" + JSON.stringify (args) );}); и т.д


15

Наконец , существует модуль под названием socket.io-wildcard, который позволяет использовать подстановочные знаки на стороне клиента и сервера

connecting

10

Ну вот ...

connect

Это позволит отлавливать события , как disconnect, connect, disconnect, reconnectingтоже, так что будьте аккуратнее.


9

Примечание: этот ответ действителен только для socket.io 0.x

Вы можете переопределить сокет. $ Emit

В следующем коде у вас есть две новые функции:

  • Ловушка всех событий
  • Ловушка только события, которые не захвачены старым методом (это прослушиватель по умолчанию)
var original_$emit = socket.$emit;
socket.$emit = function() {
    var args = Array.prototype.slice.call(arguments);
    original_$emit.apply(socket, ['*'].concat(args));
    if(!original_$emit.apply(socket, arguments)) {
        original_$emit.apply(socket, ['default'].concat(args));
    }
}

socket.on('default',function(event, data) {
    console.log('Event not trapped: ' + event + ' - data:' + JSON.stringify(data));
});

socket.on('*',function(event, data) {
    console.log('Event received: ' + event + ' - data:' + JSON.stringify(data));
});
JavaScript, события, socket.io,
Похожие вопросы