един обект не слуша събитие, излъчено от друг обект

Опитвайки се да накарам обект да излъчва и получава събития:

var events = require('events'),
    util   = require('util');

function Obj(){
  events.EventEmitter.call( this ); // what does this line?
}

util.inherits( Obj, events.EventEmitter );

var o = new Obj(),
    a = new Obj();

a.on('some', function () {
  console.log('a => some-thing happened');
});

o.on('some', function () {
  console.log('o => some-thing happened');
});

o.emit('some');
  • има отговор o => some-thing happened само от същия обект, но не и от друг. Защо? И как да ги накарам и двамата да слушат some събитие?
  • Какво прави редът events.EventEmitter.call( this );? Няма разлика в резултата. Взето от http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor

person Nik Terentyev    schedule 02.10.2014    source източник
comment
Ако бяхте задали два отделни въпроса, можех да затворя втория като дубликат на този...   -  person Bergi    schedule 02.10.2014
comment
да, намерих този. да   -  person Nik Terentyev    schedule 02.10.2014


Отговори (2)


има отговор o => some-thing happened само от същия обект, но не и от друг. Защо?

Защото те са различни емитерни обекти. Всеки излъчвател уведомява само своите слушатели; това е модел на наблюдател, а не посредник.

И как да ги накарам и двамата да слушат some събитие?

Използвайте само един EventEmitter екземпляр. Може дори да не се нуждаете от този Obj подклас, просто направете a = o = new EventEmitter().

Какво прави events.EventEmitter.call( this ); ред? Няма разлика в резултата.

Вижте Каква е разликата между тези два модела на конструктор?

person Bergi    schedule 02.10.2014
comment
Наблюдател означава, че слушате конкретна наблюдаема - и имате две от тях, само една от тях излъчва събитие. Mediator би означавало, че имате глобален обект, на който всички останали слушат и/или задействат събития. - person Bergi; 03.10.2014

  1. Те са отделни обекти, излъчващи събитие, единственото нещо, което inherits() прави, е да задава прототипа на подкласа да бъде този на прототипа на родителя. Подкласовете не са магически свързани помежду си.

  2. events.EventEmitter.call( this ); изпълнява конструктора на родителя, за да му позволи да извърши някаква своя собствена инициализация (например, настройка на обекта за слушатели на събития, който съхранява манипулатори на събития за събития и други свойства). Тогава след events.EventEmitter.call( this ); можете да извършите ваша собствена инициализация за вашия подклас върху това. Това обикновено включва свойства, които са специфични за екземпляр (напр. this.id = Math.random() * 1000);

person mscdex    schedule 02.10.2014