javascript - 有没有办法使用 Node.js EventEmitter 同时向所有监听器发出结束事件?

标签 javascript node.js

the docs说,emitter.emit(event[, arg1][, arg2][, ...])

Synchronously calls each of the listeners registered for event, in the order they were registered, passing the supplied arguments to each.

但通过这个简单的例子:

router.get('/messages', function(req, res, next) {
    var addMessageListener = function(res){
        messageBus.once('message', function(data){
            res.json(data);
        })
    }
    addMessageListener(res);
});

router.get('/push', function(req, res, next) {
    messageBus.emit('message', { awesome : 'event'})
    res.status(200).end()
});

当消息事件发出并且有两个请求正在监听时,只有其中一个正确监听该事件并执行其回调。

有没有办法同时向所有监听器发出事件?

编辑:

我不需要监听器同时执行,我只需要执行所有监听器

编辑2:

经过更多测试,当我创建多个监听器时,它们成功监听发射器(使用 messageBus.listenerCount('message') 进行调试),但有近 20 秒的延迟。

当只有一个正在监听而第二个在这段延迟期间时,如果我调用 /push 它会成功发送给监听的一个,而另一个则立即开始监听。

最佳答案

自从您使用 once()函数来添加监听器, Node 最多会调用指定的监听器一次,并且在第一次调用后它将删除该监听器。如果您希望每次发出 message 事件时都会调用监听器,则需要使用 on()函数而不是 once()

关于javascript - 有没有办法使用 Node.js EventEmitter 同时向所有监听器发出结束事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281097/

相关文章:

javascript - 大型数据集的单个 <select multiple ="multiple"> 元素的替代方案

javascript - 如何更改表格中元素的背景?

javascript - 两个字母的对象 "values"在 Chrome 调试器中是什么意思?

javascript - express.Router() 与多个 express() 对象之间的区别?

json - 使用 Cheerio 遍历 html 表

javascript - babel-eslint 不允许动态导入

javascript - 类型 'string | undefined' 的参数不可分配给类型 'string' 的参数 - TypeScript 错误

javascript - Express.js 在执行时获取地址和端口

javascript - 将缓冲区数据转换为图像

node.js - 如何在不同的模块中构建 NodeJS 应用程序?