默认情况下,每个事件可以注册最多 10 个监听器。 可以使用 [emitter.setMaxListeners(n)] 方法改变单个 EventEmitter 实例的限制。 可以使用 EventEmitter.defaultMaxListeners 属性改变所有 EventEmitter 实例的默认值。 如果此值不是一个正数,则抛出 RangeError

    设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有 EventEmitter 实例,包括之前创建的。 因而,优先使用 [emitter.setMaxListeners(n)] 而不是 EventEmitter.defaultMaxListeners

    限制不是硬性的。 EventEmitter 实例可以添加超过限制的监听器,但会向 stderr 输出跟踪警告,表明检测到可能的内存泄漏。 对于单个 EventEmitter 实例,可以使用 emitter.getMaxListeners()emitter.setMaxListeners() 暂时地消除警告:

    1. emitter.setMaxListeners(emitter.getMaxListeners() + 1);
    2. emitter.once('event', () => {
    3. // 做些操作
    4. emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
    5. });

    [--trace-warnings] 命令行标志可用于显示此类警告的堆栈跟踪。

    触发的警告可以通过 [process.on('warning')] 进行检查,并具有附加的 emittertypecount 属性,分别指向事件触发器实例、事件名称、以及附加的监听器数量。 其 name 属性设置为 'MaxListenersExceededWarning'