【问题标题】:NodeJS EventEmitter : use event name as "*"(asterisk)NodeJS EventEmitter:使用事件名称作为“*”(星号)
【发布时间】:2017-05-10 02:07:26
【问题描述】:

我试图从一个开源项目中理解一些 sn-p 代码,我不明白使用星号 '*' 作为事件名称调用 EventEmitter.emit 是什么意思。

在某些库(如 JQuery)中,'*' 作为事件名称意味着“所有事件”。

在 EventEmitter 的上下文中是什么意思?

我试图在这个项目中为'*' 事件找到一个监听器,但没有成功。

class BlaBla extends EventEmitter {

    methodCall(event){
        this.emit("*", {event}); // <- what does this mean ???
    }
}

【问题讨论】:

  • 你能发一个项目的链接吗?
  • @nem035 - 谢谢你的帮助!项目链接——github.com/liangzeng/cqrs

标签: javascript node.js eventemitter


【解决方案1】:

使用'*' 作为事件名称没有特殊效果,它的行为与正常事件相同。

您可以查看event emitter code 并看到唯一的特殊事件名称是:

示例 (repl.it code)

const {
  EventEmitter
} = require('events');

class BlaBla extends EventEmitter {

  methodCall(stuff) {
    this.emit("*", {
      stuff // <-- this gets passed as an argument to the handler for the '*' event
    });
  }
}

const b = new BlaBla();

b.on('a', (...args) => console.log('nope', ...args)); // <-- this doesn't run
b.on('b', (...args) => console.log('nope', ...args)); // <-- this doesn't run
b.on('*', (...args) => console.log('this gets called', ...args)); // <-- This runs

b.methodCall('this gets passed down');

输出

this gets called { stuff: 'this gets passed down' }

如果在这个特定项目中,当调用this.emit('*') 时调用所有事件处理程序,它们可能是手动执行此操作。

下面是一个简化的例子:

const eventNames = ['a', 'b', 'c'];

this.on('*', () =>
  eventNames.forEach(event => this.emit(event))
);

【讨论】:

    【解决方案2】:

    this.emit("*", {event});表示调用emit()方法会执行所有注册到on方法的函数。

    【讨论】:

    • 查看 code 并在 REPL 中运行它表明情况并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2013-09-08
    • 2019-08-05
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多