web-dev-qa-db-fra.com

Comment supprimer correctement les écouteurs d'événements dans le jem d'événement du nœud js

J'ai une configuration avec un GET et un POST route, l'idée étant que le POST sur la route déclenche un événement, et la route GET est un flux d'événements envoyé par le serveur qui se déclenche à chaque fois que le POSTé l'événement est déclenché ... cependant, je pense que j'ai fait quelque chose de mal car les écouteurs d'événements semblent être ajoutés régulièrement malgré le fait d'avoir un seul abonné de flux d'événements ... que fais-je de 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(){
            //
        })
    })

})
28
coffeedoughnuts

Vous devez nommer la fonction que vous attachez en tant que gestionnaire d'événements. Ensuite, en le supprimant, vous passez simplement la fonction par son nom:

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);
    });
});

Fondamentalement, removeListener recherchera la fonction donnée par référence, s'il a trouvé cette fonction, il la supprimera du gestionnaire d'événements.

40

Ou vous pouvez simplement tout gâcher dangereusement avec

rr.removeAllListener(["refresh-"+boardname])

sans référencer la fonction de rappel d'écoute anonyme.

0
goodhyun