nodejs

events

关于’newListener'

import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
// Only do this once so we don't loop forever
myEmitter.once('newListener', (event, listener) => {
  if (event === 'event') {
    // Insert a new listener in front
    myEmitter.on('event', () => {
      console.log('B');
    });
  }
});
myEmitter.on('event', () => {
  console.log('A');
});
myEmitter.emit('event');
// Prints:
//   B
//   A

“newListener” 事件通常不需要手动触发。它是一个内部机制,当你使用事件监听器的添加方法(比如 .on)来向事件注册新的监听器时,系统会自动触发 “newListener” 事件。

EventEmitter 是 nodejs 中的概念,EventTarget 是浏览器中的概念,并不相同。

  1. EventEmitter 的事件和事件处理程序: 在 Node.js 中,EventEmitter 用于创建具有事件处理能力的对象。事件是对象可以触发的操作或信号,而事件处理程序通常是监听这些事件并在事件发生时执行的函数。通常,事件处理程序也称为监听器(listeners)或回调函数。这些事件和事件处理程序是为了在对象内部或外部的其他代码中触发和响应的。

  2. EventTarget 和浏览器中的事件: 在浏览器环境中,EventTarget 接口代表可以接受事件的对象,通常是 DOM 元素。这些对象可以触发各种事件,例如点击事件、鼠标事件、键盘事件等。浏览器中的事件处理程序是前端代码定义的函数,用于响应这些事件。这些事件通常是与用户交互相关的,例如单击按钮时执行某个操作。

  3. 对内和对外的事件: 你提到的对内和对外的事件是一种抽象概念。对内的事件是对象内部的事件,通常用于对象的内部状态管理和协作。对外的事件是对象向外部暴露的接口,通常用于与外部代码进行交互。在浏览器和 Node.js 中,事件处理程序可以处理对象内部和外部的事件,具体取决于它们的设计和用途。

  4. 事件名称的一一对应: 通常情况下,事件名称应该与事件处理程序的用途相关联,以便清晰地表达意图。例如,在浏览器中,你可以在按钮元素上添加一个 “click” 事件监听器来处理单击事件,这是一种约定俗成的做法。在 Node.js 中,也通常将事件名称与其含义相关联,以提高代码的可读性。

总之,事件和事件处理程序用于在代码中实现事件驱动的逻辑,无论是在浏览器中还是在 Node.js 中。它们的设计和用途可以因环境和需求而异,但基本概念是相似的。

EventTarget 接口本身也是一个类是吗

ChatGPT

EventTarget 接口本身不是一个类,而是一个接口在 JavaScript 中,接口是一种描述对象应该具有哪些方法或属性的抽象规范,而不是一个可以直接实例化的类

在浏览器环境中,EventTarget 接口规定了对象应该具有以下方法:

addEventListener(type, listener, options):用于向对象添加事件监听器。
removeEventListener(type, listener, options):用于从对象中移除事件监听器。
dispatchEvent(event):用于触发一个事件。
DOM 元素(如 HTML 元素)通常实现了 EventTarget 接口,以便能够接受事件。但是,EventTarget 本身并不是一个类,它只是一种规范,告诉开发者要实现哪些方法来支持事件处理。

在某些 JavaScript 环境中,你可以自己创建对象并实现 EventTarget 的方法,使其具有事件处理能力,但在浏览器中,这通常不是必需的,因为 DOM 元素已经实现了这个接口,可以直接使用。

EventEmitter 和 Event 不是同一个类。它们通常代表不同的概念。

EventEmitter 通常用于创建具有事件处理功能的对象,而 “Event” 类是表示事件对象本身的通用概念。

Node.js EventTarget vs. DOM EventTarget

在 Node.js EventTarget 和 EventTarget Web API 之间有两个关键的区别:

  1. 尽管 DOM EventTarget 实例可能是分层的,但 Node.js 中没有分层和事件传播的概念。也就是说,分派到 EventTarget 的事件不会通过嵌套目标对象的层次结构传播,这些层次结构可能每个都有自己的事件处理程序集。
  2. 在 Node.js EventTarget 中,如果一个事件监听器是一个异步函数或者返回一个承诺,而返回的承诺拒绝了,那么这个拒绝就会被自动捕获并处理,就像同步抛出的监听器一样(详情请参阅 EventTarget 错误处理)。

NodeEventTarget vs. EventEmitter

NodeEventTarget 对象实现 EventEmitter API 的修改子集,该子集允许它在某些情况下近似地模拟 EventEmitter。NodeEventTarget 不是 EventEmitter 的实例,在大多数情况下不能替代 EventEmitter。

  1. EventEmitter 不同,任何给定的侦听器在每个事件类型中最多只能注册一次。多次注册侦听器的尝试将被忽略。
  2. NodeEventTarget 不模拟完整的 EventEmitter API。具体来说,不模拟 prependListener ()prependOnceListener ()rawListener ()errorMonitor API。也不会发出“ newListener”和“ RemoveListener”事件。
  3. NodeEventTarget 不为类型为“ error”的事件实现任何特殊的默认行为。
  4. NodeEventTarget 支持 EventListener 对象以及作为所有事件类型的处理程序的函数。