Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine eingehende Analyse des Ereignismoduls in NodeJS

青灯夜游
Freigeben: 2021-03-01 10:41:21
nach vorne
4864 Leute haben es durchsucht

Dieser Artikel stellt Ihnen das Veranstaltungsmodul in node im Detail vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Eine eingehende Analyse des Ereignismoduls in NodeJS

Verwandte Empfehlungen: „nodejs-Tutorial

events-Modul ist das Kernmodul von Node. Fast alle häufig verwendeten Knotenmodule erben das Ereignismodul, wie http, fs usw. In diesem Artikel wird der Ereignismechanismus in nodeJS im Detail vorgestellt.

EventEmitter

Die meisten Node.js-Kern-APIs verwenden eine herkömmliche asynchrone ereignisgesteuerte Architektur, in der bestimmte Objekttypen (Trigger genannt) regelmäßig benannte Ereignisse auslösen. Rufen Sie die Funktion auf Objekt (Listener). Beispielsweise löst ein net.Server-Objekt jedes Mal ein Ereignis aus, wenn eine neue Verbindung besteht; ein fs.ReadStream löst ein Ereignis aus, wenn eine Datei geöffnet wird; ein Stream löst ein Ereignis aus, wenn die Daten lesbar sind.

【EventEmitter】

 Die EventEmitter-Klasse wird vom Ereignismodul definiert und geöffnet. Alle Objekte, die Ereignisse auslösen können, sind Instanzen der EventEmitter-Klasse

var EventEmitter = require('events');
/*
{ [Function: EventEmitter]
  EventEmitter: [Circular],
  usingDomains: false,
  defaultMaxListeners: [Getter/Setter],
  init: [Function],
  listenerCount: [Function] }
 */
console.log(EventEmitter);
Nach dem Login kopieren

 Das EventEmitter-Attribut des Ereignismoduls verweist auf das Modul selbst

var events = require('events');
console.log(events.EventEmitter === events);//true
Nach dem Login kopieren

EventEmitter ist ein Konstruktor. Kann verwendet werden, um eine Instanz der Ereignisgenerator-Emitter-Methode zu generieren. Emitter.emit(eventName[, ...args]) der Registrierung. Ein Listener für das Ereignis namens eventName, der die bereitgestellten Parameter übergibt. Wenn das Ereignis einen Listener hat, geben Sie „true“ zurück, andernfalls geben Sie „false“ zurück

var EventEmitter = require('events');
var emitter = new EventEmitter();
/*
EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined }
 */
console.log(emitter);
Nach dem Login kopieren
[Hinweis] Überprüft nicht, ob der Listener hinzugefügt wurde. Mehrmaliges Aufrufen und Übergeben desselben EventNamens und Listeners führt dazu, dass der Listener mehrmals hinzugefügt und aufgerufen wird )】

 emitter Alias ​​​​of .on(eventName, listener)

eventName <any>
...args <any>
Nach dem Login kopieren
【emitter.prependListener()】

Im Gegensatz zur on()-Methode kann die prependListener()-Methode verwendet werden, um einen Ereignis-Listener zum hinzuzufügen Beginn des Listener-Arrays

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//true
console.log(emitter.emit('test2'));//false
Nach dem Login kopieren
【emitter .once(eventName, listener)】

 Diese Methode fügt dem Ereignis namens eventName eine einmalige Listener-Funktion hinzu. Wenn das eventName-Ereignis das nächste Mal ausgelöst wird, wird der Listener entfernt und dann

eventName <any> 事件名
listener <Function> 回调函数
Nach dem Login kopieren
Nach dem Login kopieren
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
});
emitter.on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
Nach dem Login kopieren
【emitter.prependOnceListener()】

 Diese Methode wird verwendet, um den Ereignis-Listener am Anfang des Listener-Arrays hinzuzufügen. Wenn das eventName-Ereignis das nächste Mal ausgelöst wird, wird der Listener entfernt und dann

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
Nach dem Login kopieren
【emitter.removeAllListeners([eventName])】

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1
Nach dem Login kopieren
  aufgerufen, um alle oder bestimmte eventName-Listener zu entfernen und eine EventEmitter-Referenz zurückzugeben verketteter Aufruf

  [Hinweis] Es ist eine schlechte Praxis, an anderer Stelle im Code hinzugefügte Listener zu entfernen, insbesondere wenn die EventEmitter-Instanz von anderen Komponenten oder Modulen (z. B. Sockets oder Dateistreams) erstellt wird.

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
Nach dem Login kopieren
[emitter.removeListener (eventName , listener)】

eventName <any> 事件名
listener <Function> 回调函数
Nach dem Login kopieren
Nach dem Login kopieren
 Entfernen Sie den angegebenen Listener aus dem Listener-Array des Ereignisses namens eventName

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).once('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
emitter.emit('test');//1
Nach dem Login kopieren
 [Hinweis] RemoveListener entfernt höchstens eine Listener-Instanz aus dem Listener-Array. Wenn ein einzelner Listener dem Listener-Array für einen angegebenen Ereignisnamen mehrmals hinzugefügt wird, muss „removeListener“ mehrmals aufgerufen werden, um jede Instanz zu entfernen.

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependOnceListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
emitter.emit('test');//1
Nach dem Login kopieren
  [Hinweis] Sobald ein Ereignis ausgelöst wird, werden alle daran gebundenen Listener ausgelöst Sequenz. Dies bedeutet, dass jeder Aufruf von „removeListener()“ oder „removeAllListeners()“, nachdem das Ereignis ausgelöst wurde, aber bevor die Ausführung des letzten Listeners abgeschlossen ist, diese nicht aus emit() entfernt. Nachfolgende Ereignisse werden wie erwartet eintreten

Da Listener mithilfe interner Arrays verwaltet werden, ändert dieser Aufruf den Positionsindex aller registrierten Listener, nachdem der Listener entfernt wurde. Dies hat zwar keinen Einfluss auf die Reihenfolge, in der die Listener aufgerufen werden, bedeutet jedoch, dass die Kopie des von der Methode emitter.listeners() zurückgegebenen Listener-Arrays neu erstellt werden muss

Gibt einen Listenauslöser zurück. Ein Array von Ereignissen, für die Listener registriert wurden. Die Werte im Array sind Zeichenfolgen oder Symbole

eventName <any>
Nach dem Login kopieren
Gibt eine Kopie des Listener-Arrays für das Ereignis mit dem Namen „eventName“ zurück

  默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity(或 0)表明不限制监听器的数量。返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
/*
Warning: Possible EventEmitter memory leak detected. 11 a listeners added. Use emitter.setMaxListeners() to increase limit
 */
Nach dem Login kopieren
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.setMaxListeners(11);
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
Nach dem Login kopieren

【EventEmitter.defaultMaxListeners】
  每个事件默认可以注册最多10个监听器。单个EventEmitter实例的限制可以使用emitter.setMaxListeners(n)方法改变。所有EventEmitter实例的默认值可以使用EventEmitter.defaultMaxListeners属性改变

  [注意]设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有EventEmitter 实例,包括之前创建的。因而,调用 emitter.setMaxListeners(n) 优先于 EventEmitter.defaultMaxListeners

var EventEmitter = require('events');var emitter = new EventEmitter();
EventEmitter.defaultMaxListeners = 11;
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
Nach dem Login kopieren

事件

【'newListener' 事件】

eventName <any> 要监听的事件的名称
listener  事件的句柄函数
Nach dem Login kopieren

  EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 'newListener' 事件

  注册了 'newListener' 事件的监听器会传入事件名与被添加的监听器的引用。事实上,在添加监听器之前触发事件有一个微妙但重要的副作用: 'newListener' 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入 

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('newListener',function(){
    console.log(2);
})
emitter.on('test',function(){
    console.log(1);
})

emitter.emit('test');//2 1
Nach dem Login kopieren
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
})
emitter.on('newListener',function(){
    console.log(2);
})
emitter.emit('test');//1
Nach dem Login kopieren

【'removeListener' 事件】

eventName <any> 事件名
listener  事件句柄函数
Nach dem Login kopieren

  'removeListener' 事件在 listener 被移除后触发

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('removeListener',function(){
    console.log(2);//2})
emitter.on('test',show).removeListener('test',show);
Nach dem Login kopieren
var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
Nach dem Login kopieren
var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
Nach dem Login kopieren

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Ereignismoduls in NodeJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage