2012-09-23 14 views
8

Giả sử tôi đang tạo mô-đun riêng của mình, nằm ở phía trên mô đun 'net'. mô-đun của tôi có sự kiện riêng của mình, mà còn cho phép khách hàng để lắng nghe trên các sự kiện mạng lưới phát ra bởi các kết nối tcp:trong node.js, cách chuyển tiếp tất cả các sự kiện của mô-đun đến một số khác

mymod.on('myevent',...); // my event 
mymod.on('connect',...); // net event 
mymod.on('end',...);  // net event 

Ngay bây giờ tôi đang làm như sau

... 
tcp.on('connect',function(){ self.emit('connect');}); 
tcp.on('end',function(){ self.emit('end');}); 
... 

Có cách nào nhiều thành ngữ từ tôi để chỉ đơn giản là chuyển tiếp tất cả các sự kiện (hoặc một tập hợp con của các sự kiện) từ một mô-đun cho khách hàng của một mô-đun khác?

Tôi mong đợi một tình huống như vậy luôn luôn xảy ra, vì vậy tôi muốn làm điều đó một cách sạch sẽ nhất có thể.

Trả lời

2

Điều tôi đã làm trong quá khứ là handle the newListener event. Tôi không bận tâm việc gắn các bộ xử lý cho đến khi một cái được gắn vào lớp của tôi. Sau đó, khi nó được, tôi đính kèm nó vào lớp cơ sở.

this.on('newListener', function (event, listener) { 
    baseClassInstance.on(event, listener); 
}) 

Bạn có thể lọc sự kiện nào được chuyển qua bằng cách kiểm tra thông số event trước.

Hãy cẩn thận nếu bạn phải xóa người nghe. Đây có thể không phải là giải pháp tốt nhất trong những trường hợp đó.

+0

Dường như nó sẽ là sự kiện 'removeListener' trong v0.10 (https://github.com/joyent/node/pull/3806) –

0

Tôi chưa bao giờ thử và không thể kiểm tra điều này vào lúc này nhưng bạn có thể thử những điều sau;

Proxy tất cả các sự kiện để đối tượng khác

tcp.emit = mymod.emit.bind(mymod); 

Proxy sự kiện và gọi riêng của mình;

var oldEmit = tcp.emit; 

tcp.emit = function() { 
    mymod.emit.apply(mymod, arguments); 
    return oldEmit.apply(this, arguments); 
} 

Hãy cho tôi biết nếu nó hoạt động! Ở trên chỉ là một bằng chứng về khái niệm và tôi đã không đưa ra suy nghĩ vào các tác dụng phụ của việc này.

+0

Điều này có nghĩa là các mô-đun khác nghe các sự kiện 'tcp' bình thường phát ra sẽ không có trình xử lý được gọi. –

+0

chính xác nếu nó cũng cần phải có sẵn cho các trình xử lý khác, tôi đã cập nhật mã. Dù bằng cách nào thì đây không phải là cách sử dụng được đề xuất chỉ là bằng chứng về khái niệm –

Các vấn đề liên quan