Node.js EventEmitter не работает с немедленным выбросом

Следующая проблема:

У меня есть класс save.js, который наследует событие от EventEmitter.

это похоже:

var util          = require('util');
var EventEmitter  = require('events').EventEmitter;

var save = function(pdf){
  var self = this;
  EventEmitter.call(self);

  console.log(self);

  self.emit('test', 'TEST!');

  function doSomeDatabaseStuff() {
    db.connect(function(err, connection) {
      if ( err ) self.emit('error', err);
      else {
        self.emit('test', 'TEST!');
      }
    });
}

util.inherits(save, EventEmitter);
module.exports = save;

Я инициирую это:

var saving = new save(pdf);

saving.on('sim', function(result){
  console.log(result);
});

Итак, странное поведение: первое событие отправки сразу после console.log(self) никогда не генерируется. но самостоятельная регистрация показывает, что этот класс уже унаследовал функции EventEmitter. Все другие события генерируются корректно. Любые подсказки?


person marschro    schedule 09.06.2015    source источник


Ответы (1)


Метод emit EventEmitter выполняет синхронный вызов всех зарегистрированных в данный момент обработчиков.

emit сразу после console.log вызывается, пока слушатель еще не зарегистрирован. Это объясняет, почему этот слушатель не вызывается.

Если вы действительно хотите сгенерировать событие в конструкторе, как вы делаете здесь, вам, вероятно, следует сделать это emit всегда асинхронным с

setImmediate(function() {
   self.emit('test', 'TEST!');
});

или у вас может быть неактивный конструктор, чтобы настроить и получить ссылку на вновь созданный объект, а затем иметь метод .setup или .init, который запускает активность события объекта.

person Jerome WAGNER    schedule 09.06.2015