事件發射器的工作方式是,您必須使用相同的事件發射器對象來偵聽您用來發射的事件。所以你需要這樣的東西:
要在你的項目的不同部分之間分享,你應該創建一個模塊,並在需要的時候需要它。
my-event.js:
var eventEmitter = new require('events').EventEmitter();
module.exports = eventEmitter;
然後你require
這個eventEmitter
無論你想用它
blog.js:
var myEvent = require('../my-event');
blog.post('save',function(blog){
myEvent.emit('newBlog', blog);
});
app.js:
var myEvent = require('./my-event');
myEvent.on('newBlog', console.log);
如果你不想去通過創建和要求自己的模塊的麻煩,可以使用全局process
這也是一個EventEmitter。
anywhere:
process.on('my-custom-event', myCustomHandler);
anywhere-else:
process.emit('my-custom-event', data);
雖然公平警告:你正在污染全球範圍。如果某個其他模塊也在執行相同的事件並使用相同的事件名稱,則可能會出現意外情況並且更難以調試的衝突。
我覺得從EventEmitter貓鼬架構繼承,這樣我就可以做'this.emit(」 newBlog',blog)'而不是'eventEmitter.emit('newBlog',blog);',但事件監聽器不起作用。我想如果我需要使用它時必須通過相同的事件發射器,那麼有什麼意義呢?我可以用事實上的業務邏輯來替換事件,以節省一些麻煩。 – paynestrike
@paynestrike關鍵是解耦。這意味着發出的東西不必知道所有正在聽的東西。 –
@AaronDufour那麼我怎樣才能將我的模型中的eventEmitter傳遞給app.js? – paynestrike