Heim > Web-Frontend > js-Tutorial > Beispiel-Tutorial zu Ereignissen in NodeJS-Ereignissen

Beispiel-Tutorial zu Ereignissen in NodeJS-Ereignissen

零下一度
Freigeben: 2017-06-26 11:48:38
Original
1511 Leute haben es durchsucht

Die vorherigen Wörter

Das Ereignismodul ist das Kernmodul des Knotens. Fast alle häufig verwendeten Knotenmodule erben das Ereignismodul, z. B. http, fs usw. In diesem Artikel wird der Ereignismechanismus in nodeJS im Detail vorgestellt

EventEmitter

Die meisten Node.js-Kern-APIs verwenden eine idiomatische asynchrone ereignisgesteuerte Architektur, in der bestimmte Arten von Objekte (Trigger genannt) lösen regelmäßig ein benanntes Ereignis aus, um ein Funktionsobjekt (Listener) aufzurufen. 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 zeigt auf das Modul selbst

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

EventEmitter ist ein Konstruktor, der zum Generieren einer Instanz des Ereignisgenerator-Emitters

var EventEmitter = require('events');var emitter = new EventEmitter();/*EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined } */console.log(emitter);
Nach dem Login kopieren

Methode

[emitter.emit(eventName[, ...args])]

eventName <any>...args <any>
Nach dem Login kopieren
Diese Methode ruft synchron jeden für das Ereignis namens „eventName“ registrierten Listener in der Reihenfolge auf, in der die Listener registriert sind, und übergibt dabei die bereitgestellten Parameter. Wenn das Ereignis einen Listener hat, geben Sie true zurück, andernfalls geben Sie false zurück. Funktion am Ende des Listener-Arrays für das Ereignis namens eventName

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//trueconsole.log(emitter.emit('test2'));//false
Nach dem Login kopieren
[Hinweis] Überprüft nicht, ob der Listener wurde hinzugefügt. Mehrmaliges Aufrufen und Übergeben desselben eventNamens und Listeners führt dazu, dass der Listener mehrmals hinzugefügt und aufgerufen wird

Diese Methode gibt eine EventEmitter-Referenz zurück, die in a aufgerufen werden kann Kette
eventName <any> 事件名
listener <Function> 回调函数
Nach dem Login kopieren
Nach dem Login kopieren

[emitter.addListener(eventName, listener)]
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
  Alias ​​​​von emitter.on(eventName, listener)

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.prependListener()】

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

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1
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

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.prependOnceListener()]

 Diese Methode wird verwendet, um einen 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
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);
}).once('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2emitter.emit('test');//1
Nach dem Login kopieren
[emitter.removeAllListeners([eventName])]

 Entfernen Sie alle oder bestimmte EventName-Listener und geben Sie eine EventEmitter-Referenz zurück, die in einer Kette aufgerufen werden kann

 [Hinweis] Es ist eine schlechte Idee, an anderer Stelle im Codeansatz hinzugefügte Listener zu entfernen. insbesondere, wenn die EventEmitter-Instanz von einer anderen Komponente oder einem anderen Modul (z. B. Socket oder Dateistream) erstellt wird
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 1emitter.emit('test');//1
Nach dem Login kopieren

[emitter.removeListener(eventName, listener)]
eventName <any>
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);
}).removeAllListeners('test');
emitter.emit('test');//''
Nach dem Login kopieren

[Hinweis] RemoveListener entfernt nur den Listener aus Entfernt a Listener-Instanz aus dem Listener-Array. Wenn ein einzelner Listener mehrmals zum Listener-Array für einen angegebenen Ereignisnamen hinzugefügt wird, muss „removeListener“ mehrmals aufgerufen werden, um jede Instanz zu entfernen

eventName <any>listener 
Nach dem Login kopieren

[Hinweis] Einmal, wenn ein Ereignis vorliegt ausgelöst, werden alle daran gebundenen Listener nacheinander ausgelöst. 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
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.emit('test');//''
Nach dem Login kopieren

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

[emitter.eventNames()]

Gibt ein Array zurück, das die Ereignisse auflistet, für die der Trigger registrierte Listener hat. Die Werte im Array sind Zeichenfolgen oder Symbole
var EventEmitter = require('events');var emitter = new EventEmitter();function show1(){
    console.log(1);
    emitter.removeListener('test',show2);
}function show2(){
    console.log(2);
}
emitter.on('test',show1).on('test',show2);
emitter.emit('test');//1 2emitter.emit('test');//1
Nach dem Login kopieren

[emitter.listenerCount(eventName)]

Rückgabe to listening Die Anzahl der Zuhörer für das Ereignis namens eventName

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.addListener('test1',function(){console.log(1);});
emitter.addListener('test2',function(){console.log(2);});
console.log(emitter.eventNames());//[ 'test1', 'test2' ]
Nach dem Login kopieren

[emitter.listeners(eventName)]

eventName <any> 正在被监听的事件名
Nach dem Login kopieren

Return name Eine Kopie des Listener-Arrays für eventName

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

【emitter.getMaxListeners()】

  返回 EventEmitter 当前的最大监听器限制值

var EventEmitter = require('events');var emitter = new EventEmitter();
console.log(emitter.getMaxListeners());//10
Nach dem Login kopieren

【emitter.setMaxListeners(n)】

  默认情况下,如果为特定事件添加了超过 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 vonBeispiel-Tutorial zu Ereignissen in NodeJS-Ereignissen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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