2016-10-02 22 views
5

श्रोता को हटाने की संभावना के साथ ईवेंट श्रोता विधि में कक्षा संदर्भ तक पहुंचने का कोई तरीका है?Node.js EventEmitter: ईवेंट श्रोता के लिए क्लास संदर्भ कैसे बाध्य करें और फिर इस श्रोता को हटाएं

उदाहरण 1:

import {EventEmitter} from "events"; 

export default class EventsExample1 { 
    private emitter: EventEmitter; 

    constructor(private text: string) { 
     this.emitter = new EventEmitter(); 

     this.emitter.addListener("test", this.handleTestEvent); 
     this.emitter.emit("test"); 
    } 


    public dispose() { 
     this.emitter.removeListener("test", this.handleTestEvent); 
    } 

    private handleTestEvent() { 
     console.log(this.text); 
    } 
} 

इस उदाहरण श्रोता को दूर करने में काम करता है, लेकिन handleTestEvent() विधि this का उपयोग कर वर्ग संदर्भ के लिए पहुँच नहीं है। this इवेंटइमीटर संदर्भ के लिए अंक, इसलिए this.text पहुंच योग्य नहीं है।

उदाहरण 2:

import {EventEmitter} from "events"; 

export default class EventsExample2 { 
    private emitter: EventEmitter; 

    constructor(private text: string) { 
     this.emitter = new EventEmitter(); 

     this.emitter.addListener("test", this.handleTestEvent.bind(this)); 
     this.emitter.emit("test"); 
    } 

    public dispose() { 
     this.emitter.removeListener("test", this.handleTestEvent); 
    } 

    private handleTestEvent() { 
     console.log(this.text); 
    } 
} 

इस उदाहरण में, मैं bind समारोह का उपयोग कर रहा घटना श्रोता के लिए वर्ग के संदर्भ बाध्य करने के लिए। अब handleTestEvent विधि का उपयोग this =>this.text का उपयोग कर कक्षा संदर्भ तक पहुंच है, लेकिन श्रोता को removeListener के साथ हटाया नहीं जा सकता है - ऐसा लगता है कि bind एक नया अनाम कार्य बनाता है, इसलिए बाध्य श्रोता का कोई संदर्भ नहीं है।

उदाहरण 3:

import {EventEmitter} from "events"; 

export default class EventsExample3 { 
    private emitter: EventEmitter; 

    constructor(private text: string) { 
     this.emitter = new EventEmitter(); 

     this.emitter.addListener("test",() => this.handleTestEvent()); 
     this.emitter.emit("test"); 
    } 

    public dispose() { 
     this.emitter.removeListener("test", this.handleTestEvent); 
    } 

    private handleTestEvent() { 
     console.log(this.text); 
    } 
} 

इस उदाहरण में, मैं एक तीर समारोह का उपयोग कर रहा घटना श्रोता में वर्ग के एक संदर्भ को बचाने के लिये। handleTestEvent विधि this का उपयोग कर कक्षा संदर्भ तक पहुंच है, लेकिन श्रोता को हटाया नहीं जा सकता है (उदाहरण के लिए बाध्य श्रोता के लिए कोई संदर्भ नहीं है)।

मैं एक वैकल्पिक घटना पुस्तकालय की कोशिश की है - EventEmitter3 जो वर्ग संदर्भ घटनाओं के लिए कस्टम संदर्भ (के लिए एक समर्थन हासिल है addListener समारोह (this.emitter.addListener("test", this.handleTestEvent, this), यह पूरी तरह से काम करता है के लिए तीसरे पैरामीटर के रूप में पारित किया जा सकता है, लेकिन मैं नहीं बल्कि उपयोग करना चाहते हैं शामिल EventEmitter Node.js.

से

उत्तर

4

आप निर्माता में ऐसा कर सकता है:

this.handleTestEvent = this.handleTestEvent.bind(this); 
this.emitter.addListener("test", this.handleTestEvent); 

आप किनारे काटने का उपयोग करना चाहते हैं, तो आप एक शॉर्टकट के रूप proposed bind operator उपयोग कर सकते हैं:

this.handleTestEvent = ::this.handleTestEvent; 
this.emitter.addListener("test", this.handleTestEvent); 

या एक property initializer का प्रयोग कर एक बाध्य विधि बनाने के लिए:

constructor(private text: string) { 
    this.emitter = new EventEmitter(); 

    this.emitter.addListener("test", this.handleTestEvent); 
    this.emitter.emit("test"); 
} 

handleTestEvent =() => { 
    console.log(this.text); 
} 
0

आप शायद इस हल लेकिन आप केवल

import {EventEmitter} from "events"; 

class HasEvents extends EventEmitter {} 

const emitter = new HasEvents(); 
किया जा सकता है
संबंधित मुद्दे