MST

星途 面试题库

面试题:JavaScript 的 EventEmitter 事件监听机制深度剖析

在 Node.js 的 EventEmitter 中,`once` 方法和普通的 `on` 方法有什么区别?如果在同一个事件上多次使用 `once` 方法会发生什么?请详细说明并结合代码示例。
22.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. once 方法和 on 方法的区别
    • on 方法:用于为指定事件绑定一个监听器函数。每次触发该事件时,绑定的监听器函数都会被执行。例如,假设有一个 EventEmitter 实例 emitter,绑定事件监听器如下:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('eventName', () => {
    console.log('This is a regular listener');
});
emitter.emit('eventName');
emitter.emit('eventName');

在上述代码中,每次执行 emitter.emit('eventName'),监听器函数都会输出 This is a regular listener

  • once 方法:同样用于为指定事件绑定一个监听器函数,但这个监听器函数只会在事件第一次触发时执行,后续再触发该事件,此监听器函数不会再执行。例如:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.once('eventName', () => {
    console.log('This is a once - listener');
});
emitter.emit('eventName');
emitter.emit('eventName');

在这个代码中,第一次执行 emitter.emit('eventName') 时,会输出 This is a once - listener,但第二次执行 emitter.emit('eventName') 时,不会有任何输出。 2. 在同一个事件上多次使用 once 方法:每次使用 once 方法都会为事件绑定一个新的只执行一次的监听器。当事件触发时,这些通过 once 绑定的监听器会按照绑定的顺序依次执行,且每个监听器仅执行一次。示例代码如下:

const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.once('eventName', () => {
    console.log('First once - listener');
});
emitter.once('eventName', () => {
    console.log('Second once - listener');
});
emitter.emit('eventName');

上述代码执行后,会先输出 First once - listener,然后输出 Second once - listener,再次执行 emitter.emit('eventName') 不会有任何输出。