Maison  >  Article  >  interface Web  >  Exemple de tutoriel d'événements dans les événements nodeJS

Exemple de tutoriel d'événements dans les événements nodeJS

零下一度
零下一度original
2017-06-26 11:48:381441parcourir

Les mots précédents

Le module d'événements est le module de base de node Presque tous les modules de nœuds couramment utilisés héritent du module d'événements, comme http, fs, etc. Cet article présentera en détail le mécanisme d'événements dans nodeJS

EventEmitter

La plupart des API principales de Node.js adoptent l'architecture asynchrone habituelle basée sur les événements, dans laquelle certains types de les objets (appelés déclencheur) déclenchent périodiquement un événement nommé pour appeler un objet fonction (écouteur). Par exemple, un objet net.Server déclenchera un événement à chaque nouvelle connexion ; un fs.ReadStream déclenchera un événement à l'ouverture d'un fichier ; un flux déclenchera un événement lorsque les données seront lisibles.

【EventEmitter】

La classe EventEmitter est définie et ouverte par le module d'événements. Tous les objets pouvant déclencher des événements sont des instances de la classe EventEmitter

var EventEmitter = require('events');/*{ [Function: EventEmitter]
  EventEmitter: [Circular],
  usingDomains: false,
  defaultMaxListeners: [Getter/Setter],
  init: [Function],
  listenerCount: [Function] } */console.log(EventEmitter);
L'attribut EventEmitter du module d'événements pointe vers le module lui-même

var events = require('events');
console.log(events.EventEmitter === events);//true
EventEmitter est un constructeur qui peut être utilisé pour générer une instance de l'émetteur générateur d'événements

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

Méthode

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

eventName <any>...args <any>
Cette méthode appelle de manière synchrone chaque écouteur enregistré à l'événement nommé eventName dans l'ordre dans lequel les écouteurs sont enregistrés, en transmettant les paramètres fournis. Si l'événement a un écouteur, renvoie true, sinon renvoie false Fonction à la fin du tableau d'écouteur pour l'événement nommé eventName

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//trueconsole.log(emitter.emit('test2'));//false
[Note] Ne vérifie pas si l'écouteur a été ajouté. Appeler plusieurs fois et transmettre le même eventName et le même écouteur entraînera l'ajout et l'appel de l'écouteur plusieurs fois

Cette méthode renvoie une référence EventEmitter, qui peut être appelée dans un chaîne
eventName <any> 事件名
listener <Function> 回调函数

[emitter.addListener(eventName, écouteur)]
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 ​​​​d'emetteur.on(eventName, écouteur)

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

Contrairement à la méthode on(), la méthode prependListener() peut être utilisée pour ajouter des écouteurs d'événements au début du tableau d'écoute

var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1
【emitter.once(eventName, listening)】

 Cette méthode ajoute une fonction d'écoute unique à l'événement nommé eventName. La prochaine fois que l'événement eventName sera déclenché, l'écouteur sera supprimé puis appelé

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

 Cette méthode est utilisée pour ajouter un écouteur d'événement au début du tableau d'écoute. La prochaine fois que l'événement eventName sera déclenché, l'auditeur sera supprimé puis appellera
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])]

 Supprimez tous les écouteurs eventName ou spécifiés, renvoyez une référence EventEmitter, qui peut être appelée dans une chaîne
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
 [Note] C'est une mauvaise idée de supprimer les écouteurs ajoutés ailleurs dans l'approche du code, surtout lorsque l'instance EventEmitter est créée par un autre composant ou module (tel qu'un socket ou un flux de fichiers)

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

Supprimez l'écouteur spécifié du tableau d'écouteurs de l'événement nommé eventName
var EventEmitter = require('events');var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).removeAllListeners('test');
emitter.emit('test');//''

[Remarque] RemoveListener supprimera uniquement l'écouteur de Supprime un instance d'écouteur du tableau d'écouteurs. Si un seul écouteur est ajouté plusieurs fois au tableau d'écouteurs pour un eventName spécifié, RemoveListener doit être appelé plusieurs fois pour supprimer chaque instance
eventName <any>listener 

[Remarque] Une fois Lorsqu'un événement est déclenché, tous les auditeurs qui y sont liés seront déclenchés en séquence. Cela signifie que tout appel à RemoveListener() ou à RemoveAllListeners() après le déclenchement de l'événement mais avant que le dernier écouteur ait fini de s'exécuter ne les supprimera pas d'Emit(). Les événements ultérieurs se produiront comme prévu
var EventEmitter = require('events');var emitter = new EventEmitter();function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.emit('test');//''
Étant donné que les écouteurs sont gérés à l'aide de tableaux internes, l'appel de ceci modifiera l'index de position de tous les écouteurs enregistrés après la suppression de l'écouteur. Bien que cela n'affecte pas l'ordre dans lequel les auditeurs sont appelés, cela signifie que la copie du tableau d'écouteurs renvoyé par la méthode slicer.listeners() doit être recréée

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'

Paramètres

[emitter.eventNames()]
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
Renvoie un tableau listant les événements pour lesquels le déclencheur a enregistré des auditeurs. Les valeurs du tableau sont des chaînes ou des symboles

[emitter.listenerCount(eventName)]

Retour à l'écoute Le nombre d'auditeurs pour l'événement nommé 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> 正在被监听的事件名

Retour name Une copie du tableau d'écoute pour 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);//''})

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn