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

VMware Workstation-Installation (Linux-Kernel) Kylin-Grafik-Tutorial

In diesem Artikel erfahren Sie, wie Sie Kylin auf...

Analyse der Verwendung des Linux-Schwachstellen-Scan-Tools lynis

Vorwort: Lynis ist ein Sicherheitsprüfungs- und H...

Lösungen für Probleme bei der Verwendung von addRoutes in Vue-Projekten

Inhaltsverzeichnis Vorwort 1. 404 Seite 1. Ursach...

Einrichten von VMware vSphere in VMware Workstation (Grafisches Tutorial)

VMware vSphere ist die branchenführende und zuver...

Erläuterung der Dockerfile-Anweisungen und der grundlegenden Struktur

Durch die Verwendung von Dockerfile können Benutz...

Vue+SSH-Framework zur Realisierung von Online-Chat

In diesem Artikel wird der spezifische Code des V...

So vergleichen Sie zwei Datenbanktabellenstrukturen in MySQL

Während des Entwicklungs- und Debugging-Prozesses...