我正在编写一个Node.js v10应用程序,并且我想在事件监听器函数中使用await
,所以我做了一个async
监听器函数。根据下面的代码,它似乎可以正常工作。
但是我很好奇是否存在隐藏的缺点,或者在使用async
方法将EvenEmitter
函数注册为on()
侦听器时应该注意的事情吗?以后可能有事再来咬我吗?
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');
答案 0 :(得分:1)
事件处理程序的返回值被完全忽略。来自documentation:
当
EventEmitter
对象发出事件时,该特定事件附带的所有函数都被同步调用。调用的侦听器返回的任何值都将被忽略,并将被丢弃。
因此,将侦听器标记为异步(换句话说,返回承诺)并不重要,除非@Ry提及可能带有未处理的异常。如果您需要按顺序处理事件,则可能需要做进一步的事情(您可能还想查看asynchronous vs synchronous documentation)
答案 1 :(得分:0)
嗯,不,不是我所知道的。我在EventEmitter回调中绝对在代码的任何地方使用异步函数。据我所知,没有缺点。
答案 2 :(得分:0)
如文档所述:
在事件处理程序中使用异步函数是有问题的,因为它 引发异常时可能导致未处理的拒绝
https://nodejs.org/api/events.html#events_capture_rejections_of_promises
建议不要将异步函数用作“错误”事件处理程序。