Отмена событий в Node.js

Возьмем stdin.on в качестве примера. Обратный вызов в стек stdin.on, поэтому, если я пишу (в CoffeeScript)

stdin = process.openStdin()
stdin.setEncoding 'utf8'
stdin.on 'data', (input) -> console.log 'One'
stdin.on 'data', (input) -> console.log 'Two'

то каждый раз, когда я нажимаю return в приглашении, я получаю

One
Two

Мой вопрос: есть ли способ удалить/заменить обратный вызов после привязки? Или это единственный способ связать обратный вызов прокси-сервера и управлять самим собой?

Ответы

Ответ 1

Вы можете использовать removeListener(eventType, callback) для удаления события, которое должно работать со всеми видами эмиттеров.

Пример из документации API:

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

Итак, вам нужно иметь переменную, содержащую ссылку на обратный вызов, потому что, очевидно, в противном случае невозможно определить, какой обратный вызов вы хотите удалить.

ИЗМЕНИТЬ
Должен быть кто-то вроде этого в CS:

stdin = process.openStdin()
stdin.setEncoding 'utf8'

logger = (input) -> console.log 'One'
stdin.on 'data', logger
stdin.removeListener 'data', logger

stdin.on 'data', (input) -> console.log 'Two'

Смотрите: http://nodejs.org/docs/latest/api/events.html#emitter.removeListener

Ответ 2

Или вы можете использовать:

stdin.once вместо stdin.on