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.