【问题标题】:Do all events have a listeners array or is it rather that all "emitters" have a listeners array?所有事件都有一个监听器数组还是所有“发射器”都有一个监听器数组?
【发布时间】:2020-07-02 12:22:32
【问题描述】:

我正在查看节点文档并试图了解此功能

server.on('connection', (stream) => {
  console.log('someone connected!');
});

emitter.on(eventName, listener)

我感到困惑的是这个;具体部分加粗。 "将侦听器函数添加到侦听器数组的末尾 名为 eventName 的事件。"

for 是否意味着所有发射器(在本例中是服务器)都有一个侦听器数组,并且该数组中的一些函数是“用于”(指定给)某些事件的。或者,这是否意味着所有事件都有一个侦听器数组,并且它只会将此函数(流)添加到“连接”事件中。

如果是后者,eventlistenerarray[lastindex aka (stream)] 怎么知道它只在事件发生在 emmiter... 服务器上时才运行

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    TL; TR:

    _每个你附加事件的对象来存储自己的事件(独立于其他对象)

    _每个事件名称都有自己的(有序)函数数组(独立于同一对象中的其他事件)

    详情:

    this section of the Node documentation on events 中有一个很好的例子来说明它的结构和存储方式

    const myEmitter = new MyEmitter();
    myEmitter.on('myEvent', function(a, b) {
      console.log(a, b, this, this === myEmitter);
      // Prints:
      //   a b MyEmitter {
      //     domain: null,
      //     _events: { myEvent: [Function] },
      //     _eventsCount: 1,
      //     _maxListeners: undefined } true
    });
    myEmitter.emit('myEvent', 'a', 'b');
    

    您可以看到,当记录this(事件已附加到的对象)时,事件处理程序存储在对象本身内部(在属性_events 中)。它是对象的形式,其中所有事件名称都是键,值是附加到事件的所有函数的数组。这里它是一个数组这一事实很重要,因为函数将按照它们被添加的顺序被同步调用。

    【讨论】:

    • 因此,当通过 .emit 方法“发出”事件时,它会遍历“发射器”对象以查找名为 _events: 的属性,然后调用所有事件 {eventX: [Function]}是在数组中,而那些是用逗号分隔的。在这种情况下,它是一个名为 { event: [Function]} 的匿名函数,如果我们复制了 myEmitter.on('event't, function(a,b).....cont.......应该是与发射器对象上的“事件”事件关联的两个“[Functions]”。[Function] 如何链接到(或节点如何知道)链接到列出的匿名函数,尤其是如果有 2
    • 我不确定这是否是您的意思,但并非_events 中的所有内容都被调用。当您调用.emit 时,第一个参数是事件名称(我已将答案中的myEvent 编辑为事件名称以便更清楚)。它将首先检查_events 中是否存在属性myEvent,并仅调用此数组中的函数。在数组中保存了对.on调用绑定到事件的函数的直接引用,因此Node可以只调用数组元素,你可以认为它就像整个函数保存在数组中(.. .)
    • 您不必使用匿名函数,您可以使用之前声明的命名函数,在这种情况下,日志将显示[Function: nameOfTheFunction]
    • 我想我的意思是如果有多个匿名函数怎么办?它们是如何区分的?
    • 与通常相同的方式(如setTimeout、回调等),每个匿名函数在内存中创建自己的引用。如果您复制代码myEmitter.on('even't, function(a,b){ }),实际上会在内存中创建两个单独的函数引用,即使它是完全相同的代码。
    【解决方案2】:

    发射器(在本例中为服务器)跟踪所有附加的事件侦听器,没有全局事件侦听器数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多