Cách trình phát sự kiện hoạt động là bạn phải sử dụng đối tượng phát hiện sự kiện cùng để nghe trên đó bạn đã sử dụng để phát ra. Vì vậy, bạn cần một cái gì đó như thế này:
Để chia sẻ điều này giữa các phần khác nhau của dự án, bạn nên tạo một mô-đun ra khỏi nó và yêu cầu nó ở bất cứ nơi nào cần thiết.
my-event.js:
var eventEmitter = new require('events').EventEmitter();
module.exports = eventEmitter;
Sau đó, bạn require
này eventEmitter
bất cứ nơi nào bạn muốn sử dụng nó
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);
Nếu bạn không muốn phải trải qua những rắc rối của việc tạo ra và đòi hỏi phải có mô-đun riêng bạn, bạn có thể sử dụng toàn cầu process
đó cũng là một EventEmitter.
anywhere:
process.on('my-custom-event', myCustomHandler);
anywhere-else:
process.emit('my-custom-event', data);
Mặc dù một cảnh báo công bằng: bạn đang làm ô nhiễm phạm vi toàn cầu. Nếu một số mô-đun khác cũng làm như vậy và sử dụng cùng tên sự kiện thì bạn có một xung đột có thể xuất hiện theo cách bất ngờ và thậm chí còn khó khăn hơn để gỡ lỗi.
Tôi nghĩ kế thừa schema mongoose từ EventEmitter, vì vậy tôi chỉ có thể làm 'this.emit (' newBlog ', blog) 'thay vì' eventEmitter.emit (' newBlog ', blog); ', nhưng trình xử lý sự kiện sẽ không hoạt động.và tôi nghĩ rằng nếu tôi phải vượt qua cùng một bộ phát sinh sự kiện bất cứ khi nào tôi cần sử dụng nó, thì điểm là gì? Tôi chỉ có thể thay thế sự kiện bằng logic kinh doanh thực tế để tiết kiệm cho tôi một loạt rắc rối. – paynestrike
@paynestrike Điểm chính là tách. Nó có nghĩa là thứ phát ra không phải biết về tất cả những thứ đang lắng nghe. –
@AaronDufour thì làm cách nào tôi có thể chuyển eventEmitter trong mô hình của mình sang app.js? – paynestrike