11

我想在保存新博客时发出事件

blog.post('save',function(blog){
    this.emit('newBlog',blog)
})

在我项目的其他地方说 app.js 可以监听这个事件

EventEmitter  = require('events').EventEmitter;
emitter = new EventEmitter();

emitter.on('newBlog',function(blog){
    console.log(blog);
})

这个怎么做?

4

2 回答 2

9

事件发射器的工作方式是您必须使用相同的事件发射器对象来监听您曾经发出的事件。所以你需要这样的东西:

要在项目的不同部分之间共享它,您应该从中创建一个模块并在需要的地方使用它。

my-event.js:

var eventEmitter = new require('events').EventEmitter();
module.exports = eventEmitter; 

然后你requireeventEmitter任何你想使用它的地方

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 的 global。

anywhere:

process.on('my-custom-event', myCustomHandler);

anywhere-else:

process.emit('my-custom-event', data);

尽管是一个公平的警告:您正在污染全局范围。如果其他一些模块也在做同样的事情并使用相同的事件名称,那么你就有可能以意想不到的方式出现并且更难调试的冲突。

于 2015-06-01T13:01:46.237 回答
4

如果您从文档(特定模式的实例)发出事件,那么您必须侦听此实例以接收事件。

如果要全局侦听所有实例生成的所有事件,则必须从 Schema 发出事件。

blog.post('save',function(blog){
    blog.schema.emit('newBlog',blog)
})

例如,在您的 app.js 中,您可以侦听架构上的事件:

Blog.schema.on('newBlog',function(blog){
    console.log(blog);
})
于 2015-06-09T20:23:40.897 回答