Cómo eliminar correctamente los oyentes de eventos en el nodo js eventemitter


Tengo una configuración con una ruta GET y una POST, la idea es que la publicación en la ruta desencadena un evento, y la ruta GET es un flujo de eventos enviado por el servidor que se dispara cada vez que se activa el evento publicado... sin embargo, creo que he hecho algo mal ya que los oyentes de eventos parecen agregarse rutinariamente 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(){
            //
        })
    })

})
Author: coffeedoughnuts, 2014-05-27

1 answers

Debe nombrar la función que adjunta como controlador de eventos. Luego, al eliminarlo, simplemente pasa la función por 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 hander de eventos.

 35
Author: Farid Nouri Neshat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 16:00:06