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');
3 Réponses :
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.
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 )
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".
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.