Извините, если это дубликат, я часами искал в Интернете и ничего не нашел, поэтому решил опубликовать здесь.
Я разрабатываю модуль для node.js, который должен иметь дело с соединениями сокетов. Я хочу создать функцию, которая возвращает объект пользователю, который затем будет получать события, на которые пользователь может установить прослушиватели. Однако я хочу сделать это так, чтобы пользователь не мог генерировать события для этого объекта. Вместо этого я хочу, чтобы функция emit в моем эмиттере событий была перезаписана моей собственной функцией.
По сути, я хочу вернуть объект, который получает события и имеет функцию под названием «испускать», которая действует как любая обычная функция.
Вот небольшой пример того, что я имею в виду:
var events = require('events');
var out = (function(){
var obj = new events.EventEmitter();
// I used nextTick to emulate the asyncrounes nature of the socket server
process.nextTick(function(){
obj.emit('Message', "Dummy socket message") // This will be triggered when a message is sent to the socket server
})
return obj;
})();
out.on('Message', function(msg){
console.log(msg)
out.emit("newWork", "New instructions")
// Im trying to make it work so that this would not throw the event emitter into an infinite loop
});
Теперь, в части out.on("Message", function
..., я хочу, чтобы пользователь мог писать out.emit("dummy", "dummy data")
и мог вызывать мою собственную функцию emit, которая что-то делает с предоставленными входными данными.
Как мне это сделать?
Я знаю, что это должно быть как-то возможно, поскольку socket.io делает именно это. Вот небольшой фрагмент кода с socket.io
socket.on('test', function(){
console.log("called!")
})
socket.emit("test")
Когда я запускаю это, оно не срабатывает само по себе. Кажется, что функция emit перезаписана чем-то другим, но объект сокета по-прежнему получает события, которые каким-то образом испускаются изнутри.
Надеюсь, что моего объяснения было достаточно. Заранее спасибо!
Редактировать: я знаю, что использование (function() { ... })()
- это не способ создания модулей. Я использую здесь просто для того, чтобы упростить иллюстрацию, поскольку концепция остается неизменной с этим подходом.