Nodejs EventEmitter - Определяет область для функции слушателя - PullRequest
8 голосов
/ 04 ноября 2011

Я бы хотел что-то вроде этой работы:

var Events=require('events'),
    test=new Events.EventEmitter,
    scope={
        prop:true
    };

test.on('event',function() {
   console.log(this.prop===true);//would log true
});
test.emit.call(scope,'event');

Но, к сожалению, слушателю даже не звонят. Есть ли способ сделать это с EventEmitter? Я мог бы Function.bind слушателю, но я действительно надеюсь, что EventEmitter имеет какой-то особый (или очевидный;) способ сделать это ...

Спасибо за помощь!

Ответы [ 3 ]

11 голосов
/ 05 ноября 2011

Нет, поскольку значение this в слушателе является объектом-источником события.

Однако, что вы можете сделать, это

var scope = {
  ...
};
scope._events = test._events;
test.emit.call(scope, ...);

Причина, по которой ваш обработчик событий не был вызван, заключается в том, что все обработчики хранятся в ._events, поэтому, если вы скопируете ._events, он должен работать.

2 голосов
/ 05 ноября 2011

Это не сработает, и emit имеет только удобный способ передачи параметров, но ни один для установки this.Похоже, вам придется делать вещи связывания самостоятельно.Однако вы можете просто передать его в качестве параметра:

test.on('event',function(self) {
   console.log(self.prop===true);//would log true
});
test.emit('event', scope);
0 голосов
/ 02 октября 2014

Я наткнулся на это сообщение, когда Google искал пакет в NPM, который обрабатывает это:

var ScopedEventEmitter = require("scoped-event-emitter"),
    myScope = {},
    emitter = new ScopedEventEmitter(myScope);

emitter.on("foo", function() {
    assert(this === myScope);
});

emitter.emit("foo");

Полное раскрытие, это пакет, который я написал.Я нуждался в этом, чтобы я мог иметь объект со свойством EventEmitter, которое испускает содержащий объект.Страница пакета NPM: https://www.npmjs.org/package/scoped-event-emitter

...