2
votes

Y a-t-il un problème avec l'utilisation de la fonction async en tant qu'écouteur EventEmitter?

J'écris une application Node.js v10 et j'aimerais utiliser await dans une fonction d'écoute d'événement, j'ai donc créé une fonction d'écoute async . D'après le code ci-dessous, cela semble fonctionner.

Mais je suis curieux de savoir s'il y a un inconvénient caché ou quelque chose dont je devrais être conscient lors de l'enregistrement d'une fonction async en tant que EvenEmitter code> auditeur en utilisant la méthode on () ? Quelque chose pourrait revenir me mordre plus tard?

const EventEmitter = require('events');

const emitter = new EventEmitter();

const syncListener = () => {
  console.log('sync bar ');
};

const asyncListener = async () => {
  console.log('async bar');
};

emitter.on('foo', asyncListener);
emitter.on('foo', syncListener);

emitter.emit('foo');


1 commentaires

Vous risquez des rejets non gérés, mais si vos fonctions asynchrones ne lancent jamais ou si vous prévoyez quoi que ce soit qui se passe avec des rejets non gérés dans votre environnement, tout va bien.


3 Réponses :


1
votes

Eh bien, non, pas à ma connaissance. J'utilise des fonctions asynchrones dans les rappels EventEmitter absolument partout dans mon code. D'après ce que je peux dire, il n'y a aucun inconvénient.


0 commentaires

4
votes

La valeur de retour des gestionnaires d'événements est complètement ignorée. Dans la documentation :

Lorsque l'objet EventEmitter émet un événement, toutes les fonctions attachées à cet événement spécifique sont appelées de manière synchrone. Toutes les valeurs renvoyées par les écouteurs appelés sont ignorées et seront ignorées.

Donc, marquer un auditeur comme asynchrone (en d'autres termes, renvoyer une promesse) n'a pas d'importance, sauf comme @Ry le mentionne avec des exceptions éventuellement non gérées. Si vous avez besoin que le traitement des événements se déroule en séquence, vous devrez peut-être faire quelque chose de plus (vous pouvez également consulter le documentation asynchrone vs synchrone )


0 commentaires

0
votes

Comme l'indique le document:

L'utilisation de fonctions asynchrones avec des gestionnaires d'événements pose problème, car peut conduire à un rejet non géré en cas d'exception levée

https://nodejs.org/api/events.html#events_capture_rejections_of_promises

la recommandation est de ne pas utiliser les fonctions asynchrones comme gestionnaires d'événements "d'erreur".


0 commentaires