Skip to content

events

events เป็นโมดูลในตัวของ Node.js ที่ใช้สำหรับการจัดการและสร้าง Event Emitters

import { EventEmitter } from 'node:events';

APIคำอธิบายลักษณะคำอธิบายเพิ่มเติม
emitter.on()ฟังก์ชันสำหรับรับฟัง eventAsynchronousกำหนด callback เมื่อเกิด event
emitter.once()รับฟัง event เพียงครั้งเดียวAsynchronousลบ listener อัตโนมัติหลังเรียกครั้งแรก
emitter.emit()ส่ง eventSynchronousเรียก listener ทั้งหมดที่เกี่ยวข้องกับ event นั้น
emitter.off()หยุดรับฟัง eventSynchronousลบ listener ที่กำหนด
emitter.removeAllListeners()ลบ listener ทั้งหมดSynchronousลบทุก listener สำหรับ event ที่กำหนดหรือทั้งหมด
emitter.eventNames()ดูรายการ event ทั้งหมดSynchronousคืนค่า array ของชื่อ event ที่มี listener อยู่

ตัวอย่าง

การสร้าง EventEmitter พื้นฐาน

js
import { EventEmitter } from "events";

// สร้าง emitter ใหม่
const emitter = new EventEmitter();

// กำหนด listener สำหรับ event 'greet'
emitter.on("greet", (name) => {
  console.log(`สวัสดี ${name}`);
});

// ส่ง event 'greet'
emitter.emit("greet", "สมชาย");

การใช้ once() สำหรับ event ครั้งเดียว

js
import { EventEmitter } from "events";

const emitter = new EventEmitter();

// กำหนด listener ที่ทำงานเพียงครั้งเดียว
emitter.once("login", (user) => {
  console.log(`User ${user} logged in (first time only)`);
});

// ส่ง event หลายครั้ง
emitter.emit("login", "user1");
emitter.emit("login", "user2"); // จะไม่แสดงผล

การจัดการ error event

js
import { EventEmitter } from "events";

const emitter = new EventEmitter();

// กำหนด listener สำหรับ error
emitter.on("error", (err) => {
  console.error("เกิดข้อผิดพลาด:", err.message);
});

// ส่ง error event
emitter.emit("error", new Error("Something went wrong"));

การสร้างคลาสที่สืบทอดจาก EventEmitter

js
import { EventEmitter } from "events";

class MyEmitter extends EventEmitter {
  constructor() {
    super();
    this.counter = 0;
  }

  increment() {
    this.counter++;
    this.emit("incremented", this.counter);
  }
}

// ใช้งาน
const myEmitter = new MyEmitter();
myEmitter.on("incremented", (count) => {
  console.log("ค่าใหม่:", count);
});

myEmitter.increment();
myEmitter.increment();

การลบ listener

js
import { EventEmitter } from "events";

const emitter = new EventEmitter();

function listener(data) {
  console.log("ข้อมูล:", data);
}

// เพิ่ม listener
emitter.on("data", listener);

// ส่ง event
emitter.emit("data", "ข้อมูลแรก");

// ลบ listener
emitter.off("data", listener);

// ส่ง event อีกครั้ง (จะไม่มีผล)
emitter.emit("data", "ข้อมูลที่สอง");

การตรวจสอบ listener

js
import { EventEmitter } from "events";

const emitter = new EventEmitter();

emitter.on("start", () => console.log("เริ่มทำงาน"));
emitter.on("end", () => console.log("สิ้นสุดการทำงาน"));

// ตรวจสอบจำนวน listener
console.log("start listeners:", emitter.listenerCount("start"));
console.log("end listeners:", emitter.listenerCount("end"));

// ดูชื่อ events ทั้งหมดที่มี listener
console.log("Event names:", emitter.eventNames());

การส่งหลาย arguments

js
import { EventEmitter } from "events";

const emitter = new EventEmitter();

emitter.on("message", (sender, message, timestamp) => {
  console.log(`[${timestamp}] ${sender}: ${message}`);
});

// ส่ง event พร้อมหลาย arguments
const now = new Date().toISOString();
emitter.emit("message", "admin", "Hello everyone", now);

การตั้งค่า max listeners

js
import { EventEmitter } from "events";

const emitter = new EventEmitter();

// ตั้งค่าจำนวน listener สูงสุด (เพื่อหลีกเลี่ยง memory leak)
emitter.setMaxListeners(20);

// เพิ่มหลาย listeners
for (let i = 0; i < 15; i++) {
  emitter.on("event", () => console.log(`Listener ${i}`));
}

console.log("Current max listeners:", emitter.getMaxListeners());