Подтвердить что ты не робот

Как правильно удалить прослушиватели событий в node js eventemitter

У меня есть настройка с GET и POST-маршрутом, идея состоит в том, что POSTing на маршрут запускает событие, а GET-маршрут является потоком событий, отправленным сервером, который срабатывает каждый раз, когда запускается событие POSTed... однако, я думаю, что я сделал что-то неправильно, поскольку слушатели событий, похоже, добавляются регулярно, несмотря на наличие только одного абонента потока событий... что я делаю неправильно?

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(){
            //
        })
    })

})
4b9b3361

Ответ 1

Вы должны назвать функцию, которую вы присоединяете как обработчик событий. Затем, удалив его, вы просто передаете функцию по имени:

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

В основном removeListener будет искать данную функцию по ссылке, если она найдет эту функцию, она удалит ее из обработчика событий.

Ответ 2

Или вы можете просто опасно уничтожить все с помощью

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

без ссылки на функцию обратного вызова анонимного слушателя.