使用异步功能作为EventEmitter侦听器有任何问题吗?

时间:2019-04-27 15:06:26

标签: javascript node.js asynchronous eventemitter

我正在编写一个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');

3 个答案:

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

建议不要将异步函数用作“错误”事件处理程序。