So passen Sie einen EventEmitter in node.js an

So passen Sie einen EventEmitter in node.js an

Vorwort

In letzter Zeit besteht eine Nachfrage nach Großhandelswaren. Wir müssen entsprechende Großhandelswaren für verschiedene Händler auswählen und sie wieder auf der ursprünglichen Benutzeroberfläche anzeigen. Da sich der Code des Projekts auf dem Antiquitätenniveau des Unternehmens befindet (diese Art von Code ist für Programmierer eine Qual), gehen wir bei der Lösung von Problemen sehr vorsichtig vor. Um dieses Problem zu vermeiden und externe Abhängigkeiten zu reduzieren, kapseln Sie Ereignisverteilungsfunktionen manuell.

1. Was ist

Wir wissen, dass Node einen ereignisgesteuerten Mechanismus verwendet, und EventEmitter ist die Grundlage für die ereignisgesteuerte Implementierung von Node. Basierend auf EventEmitter erben fast alle Module von Node diese Klasse. Diese Module haben ihre eigenen Ereignisse, die Listener binden/auslösen und asynchrone Vorgänge implementieren können.
Viele Objekte in Node.js lösen Ereignisse aus. Beispielsweise löst das Objekt fs.readStream ein Ereignis aus, wenn eine Datei geöffnet wird. Diese Objekte, die Ereignisse generieren, sind Instanzen von events.EventEmitter. Diese Objekte verfügen über eine Funktion eventEmitter.on(), mit der eine oder mehrere Funktionen an das benannte Ereignis gebunden werden.

2. So verwenden Sie EventEmitter in nodejs

Das Ereignismodul von Node stellt nur eine EventEmitter-Klasse bereit, die das grundlegende Muster der asynchronen ereignisgesteuerten Architektur von Node implementiert – das Beobachtermuster. In diesem Muster verwaltet das beobachtete (Subjekt) eine Gruppe von Beobachtern, die von anderen Objekten gesendet (registriert) werden. Wenn ein neues Objekt an dem Subjekt interessiert ist, registriert es den Beobachter, und wenn es kein Interesse hat, meldet es sich ab. Wenn das Subjekt aktualisiert wird, benachrichtigt es wiederum die Beobachter.

const EventEmitter = erfordern('Ereignisse')
Klasse MyEmitter erweitert EventEmitter {}
const myEmitter = new MyEmitter()
Funktion Rückruf() {
    console.log('Das Ereignis wurde ausgelöst!')
}
myEmitter.on('Ereignis', Rückruf)
myEmitter.emit('Ereignis')
myEmitter.removeListener('Ereignis', Rückruf);

3. Implementierungsprozess

Der Basiscode lautet wie folgt:

//Ereignisverteilungsmechanismus (function() {
    var EventDispatcher = Funktion() {
        var EventDispatcherClosure = Funktion() {

        };
        EventDispatcherClosure.prototype = {
            /**
             * Ereignis registrieren * @param {Object} key
             * @param {Objekt} fn
             */
            ein: Funktion (Taste, fn) {
                //Das aktuelle Ereignisobjekt abrufen var curEvents = this._getCurEvents(key);
                //Zuerst prüfen, ob das Ereignis registriert wurde var flag = false;
                für (var i = 0, len = curEvents.length; i < len; i++) {
                    wenn (curEvents[i].name == fn.name) {
                        //Es ist bereits erschienen, die zuletzt registrierte Funktion ist das Hauptflag = true;
                        aktuelleEreignisse[i] = fn;
                        brechen;
                    }
                }
                wenn (!flag) {
                    curEvents[curEvents.Länge] = fn;
                }
                this._register(Schlüssel, aktuelleEreignisse);
            },
            /**
             * Ereignis versenden * @param {Object} Schlüssel
             * @param {Objekt} Daten
             */
            Versand: Funktion (Schlüssel) {
                //Das aktuelle Ereignisobjekt abrufen var curEvents = this._getCurEvents(key);
                var sollteDispatch = true;
                für (var i = 0, len = curEvents.length; shouldDispatch && i < len; i++) {
                    versuchen {
                        //Parameter abrufen var args = [];
                        für (var j = 1, len1 = Argumente.Länge; j < len1; j++) {
                            args.push(Argumente[j]);
                        }
                        sollteDispatch = curEvents[i].apply({}, args);
                    } fangen (e) {
                        sollteDispatch = falsch;
                    }
                }
                Rückgabe sollteDispatch;
            },
            entfernen: Funktion(Taste) {
                wenn (this._getCurEvents(Schlüssel)) {
                    lösche EventDispatcherClosure.events[key];
                }
            },
            /**
             * Ereignisliste basierend auf Schlüssel abrufen * @param {Object} Schlüssel
             */
            _getCurEvents: Funktion(Schlüssel) {
                gibt EventDispatcherClosure.events[Schlüssel] zurück || [];
            },
            /**
             * Registrierungszeit* @param {Object} key
             * @param {Object} Ereignisse
             */
            _register: Funktion (Schlüssel, Ereignisse) {
                EventDispatcherClosure.events[Schlüssel] = Ereignisse;
            },
        };
        EventDispatcherClosure.events = {};
        zurückkehren {
            erstellen: function() {
                gibt einen neuen EventDispatcherClosure() zurück;
            }
        };
    };
    Fenster.EventDispatcher = neuer EventDispatcher().create();
})();

Definieren Sie zunächst eine anonyme Funktion einer globalen Variablen und hängen Sie dann die globale Variable an das Fenster, damit wir sie während des Entwicklungsprozesses aufrufen können. Fügen Sie der Prototypkette der anonymen Funktion Ereignisverteilung, Ereignisüberwachung, Ereignislöschung und andere Methoden hinzu.

Ereignisdispatchaufruf

EventDispatcher.dispatch("test", Objekt)

Ereignisüberwachung

EventDispatcher.on("test", Funktion Rückruf(Objekt) {
})

Ereignislöschung

EventDispatcher.on("test")

Die Codekapselung ist relativ einfach

Dies ist das Ende dieses Artikels zum Anpassen der Implementierung eines EventEmitters in node.js. Weitere Informationen zur Implementierung eines EventEmitters in node finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Node.js von Grund auf lernen - Tutorial 6: Beispiel, wie EventEmitter Ereignisse sendet und empfängt
  • Einführung in die Verwendung von Node.js events.EventEmitter
  • Anweisungen zur Verwendung der Methode events.EventEmitter.listenerCount in node.js

<<:  So verwenden Sie nginx, um auf lokale statische Ressourcen auf einem Linux-Server zuzugreifen

>>:  Zwei Abfragemethoden, wenn der MySQL-Abfragefeldtyp JSON ist

Artikel empfehlen

Beispielcode für die programmgesteuerte Verarbeitung von CSS-Stilen

Vorteile eines programmatischen Ansatzes 1. Globa...

Projektpraxis zum Bereitstellen von Docker-Containern mit Portainer

Inhaltsverzeichnis 1. Hintergrund 2. Bedienungssc...

Was bedeutet das „a“ in rgba? CSS RGBA-Farbleitfaden

RGBA ist eine CSS-Farbe, mit der Farbwert und Tra...

Wie stellt MySQL die Master-Slave-Konsistenz sicher?

Inhaltsverzeichnis Das Grundprinzip von MySQL Mas...

Mehrere Möglichkeiten zum Ändern des MySQL-Passworts

Vorwort: Bei der täglichen Verwendung der Datenba...

CSS3 verwendet scale() und rotate() zum Zoomen und Drehen

1. scale()-Methode Zoom steht für „Verkleinern“ u...

Ladeanimation mit CSS3 implementiert

Ergebnisse erzielen Implementierungscode <h1&g...

Vue realisiert kaskadierende Auswahl von Provinzen, Städten und Bezirken

Vor Kurzem musste ich einen kaskadierenden Auswah...

Zusammenfassung häufig verwendeter Toolfunktionen in Vue-Projekten

Inhaltsverzeichnis Vorwort 1. Benutzerdefinierter...

vue + ts realisiert den Effekt des Ziehens von Elementen mit der Maus

In diesem Artikelbeispiel wird der spezifische Co...

Einführung in geplante Aufgaben im Linux-System

Inhaltsverzeichnis 1. Planaufgaben anpassen 2. Ze...

So vereinheitlichen Sie den Zeichensatz einer vorhandenen MySQL-Datenbank

Vorwort In der Datenbank sind einige Datentabelle...