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

Beispiel-Tutorial zu Ereignissen in NodeJS-Ereignissen

零下一度
零下一度Original
2017-06-26 11:48:381392Durchsuche

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);

Das EventEmitter-Attribut des Ereignismoduls zeigt auf das Modul selbst

var events = require('events');
console.log(events.EventEmitter === events);//true

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);

Methode

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

eventName <any>...args <any>
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
[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> 回调函数

[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
  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
【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
【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

[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> 回调函数
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
[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

[emitter.removeListener(eventName, listener)]
eventName <any>

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');//''

[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 

[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');//''

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'
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

[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' ]

[emitter.listeners(eventName)]

eventName <any> 正在被监听的事件名

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

【emitter.getMaxListeners()】

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

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

【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 */
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(){});

【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(){});

 

事件

【'newListener' 事件】

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

  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
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

【'removeListener' 事件】

eventName <any> 事件名
listener  事件句柄函数

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

 

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!

Stellungnahme:
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