readable passthrough nodejs node javascript node.js express eventemitter event-stream

passthrough - stream javascript



Cómo eliminar correctamente los escuchas de eventos en el nodo js eventemitter (1)

Tengo una configuración con una ruta GET y POST, la idea es que POSTing a la ruta desencadena un evento, y la ruta GET es un flujo de eventos enviado por el servidor que se activa cada vez que se desencadena el evento POST ... sin embargo, i creo que he hecho algo mal, ya que los oyentes de eventos parecen ser agregados de manera rutinaria a pesar de tener solo un suscriptor de flujo de eventos ... ¿qué estoy haciendo mal?

var events = require(''events''), EventEmitter = events.EventEmitter, rr = new EventEmitter(); app.post(''/api/:boardname/remoterefresh'', function(req, res){ var boardname = req.param(''boardname''), data = new Date().getTime(); rr.emit("refresh-"+boardname, data) res.json({data: data}) }); app.get(''/api/:boardname/remoterefresh'', function(req, res){ var boardname = req.param(''boardname'') rr.on("refresh-"+boardname, function(data){ setTimeout(function(){ res.write(''data: ''+data+''/n/n''); }, 1000) }); req.socket.setTimeout(Infinity); res.writeHead(200, { ''Content-Type'': ''text/event-stream'', ''Cache-Control'': ''no-cache'', ''Connection'': ''keep-alive'' }); res.write(''/n''); req.on(''close'', function(){ console.log(''closed'') rr.removeListener("refresh-"+boardname, function(){ // }) }) })


Debe nombrar la función que adjunta como controlador de eventos. Luego, al eliminarlo, simplemente pasa la función por su nombre:

app.get(''/api/:boardname/remoterefresh'', function(req, res){ var boardname = req.param(''boardname'') function refreshHandler(data){ setTimeout(function(){ res.write(''data: ''+data+''/n/n''); }, 1000) } rr.on("refresh-"+boardname, refreshHandler); req.socket.setTimeout(Infinity); res.writeHead(200, { ''Content-Type'': ''text/event-stream'', ''Cache-Control'': ''no-cache'', ''Connection'': ''keep-alive'' }); res.write(''/n''); req.on(''close'', function(){ console.log(''closed'') rr.removeListener("refresh-"+boardname, refreshHandler); }); });

Básicamente, removeListener buscará la función dada por referencia, si encuentra esa función, la eliminará del controlador de eventos.