Skip to content

Events Module (ระบบอีเวนต์)

ทำไม Events ถึงสำคัญ?

Events คือหัวใจของ Node.js ช่วยให้โปรแกรมตอบสนองต่อเหตุการณ์ต่างๆ ได้ทันที เช่น รับข้อมูล, แจ้งเตือน, หรือเกิดข้อผิดพลาด มือใหม่ควรเข้าใจ events เพื่อเขียนโค้ดที่ยืดหยุ่นและรองรับงาน async

  • ใช้ events สื่อสารระหว่างส่วนต่างๆ ของโปรแกรม
  • ทำให้โค้ดไม่ต้องรันทีละบรรทัด (non-blocking)
  • เหมาะกับงานที่ต้องรอข้อมูลหรือเหตุการณ์จากภายนอก

แนะนำ Events module

events เป็น built-in module ของ Node.js สำหรับสร้างและจัดการ event-driven programming โดยใช้คลาส EventEmitter

ฟังก์ชันหลักที่ใช้บ่อย

EventEmitter.on(event, listener)

ตั้งให้ "ฟัง" เหตุการณ์ เมื่อเกิด event จะรันฟังก์ชันที่กำหนด

EventEmitter.emit(event, [...args])

ส่งสัญญาณว่า event นี้เกิดขึ้นจริง


ตัวอย่างโค้ด Events ใน Node.js (ESM)

js
// ใช้ ES Modules (ESM)
import { EventEmitter } from "node:events";

const myEmitter = new EventEmitter();

// ตั้งให้ฟัง event 'greet'
myEmitter.on("greet", () => {
  console.log("Hello! มีคนทักทายแล้ว");
});

// ส่งสัญญาณว่าเกิด event 'greet'
myEmitter.emit("greet"); // แสดงผล Hello! มีคนทักทายแล้ว

อธิบายทีละบรรทัด (ESM):

  1. นำเข้า EventEmitter จาก 'node:events' ด้วย import (ES Modules)
  2. สร้างอ็อบเจ็กต์ myEmitter เพื่อใช้จัดการ event
  3. ใช้ .on('greet', ... ) ตั้งให้ฟังเหตุการณ์ชื่อ "greet" ถ้าเกิดขึ้นจะรันฟังก์ชันที่กำหนด
  4. ใช้ .emit('greet') ส่งสัญญาณว่าเหตุการณ์นี้เกิดขึ้นจริง (เหมือนมีคนมากดกริ่ง)

เปรียบเทียบ CommonJS vs ESM

  • CommonJS: const EventEmitter = require('events');
  • ESM: import { EventEmitter } from 'node:events';

ตัวอย่างการใช้งานในสถานการณ์จริง

1. แจ้งเตือนเมื่อโหลดข้อมูลเสร็จ

js
import { EventEmitter } from "node:events";

const loader = new EventEmitter();

function fetchData() {
  setTimeout(() => {
    loader.emit("loaded", { data: "ข้อมูลจากเซิร์ฟเวอร์" });
  }, 1000);
}

loader.on("loaded", (payload) => {
  console.log("โหลดเสร็จ:", payload.data);
});

fetchData();

2. ระบบ plugin ที่แต่ละส่วนรอรับ event ของตัวเอง

js
import { EventEmitter } from "node:events";

const appEvents = new EventEmitter();

function pluginA() {
  appEvents.on("user:login", (user) => {
    console.log("PluginA: ยินดีต้อนรับ", user);
  });
}

function pluginB() {
  appEvents.on("user:login", (user) => {
    console.log("PluginB: ส่งอีเมลแจ้งเตือน", user);
  });
}

pluginA();
pluginB();
appEvents.emit("user:login", "Alice");

ข้อควรระวัง

  • หากไม่มี listener สำหรับ event ที่ emit จะไม่มี error (ยกเว้นบาง event เช่น 'error')
  • อย่าลืมลบ listener ที่ไม่ใช้แล้วด้วย .off หรือ .removeListener เพื่อป้องกัน memory leak

Event-driven Programming คืออะไร?

  • โปรแกรมตอบสนองเมื่อมีเหตุการณ์บางอย่างเกิดขึ้น (เช่น รับข้อมูล, error, การคลิก)
  • ไม่ต้องรอทีละบรรทัดแบบเดิมๆ
  • เหมาะกับงาน async, งานที่ต้องรอข้อมูล, หรือโต้ตอบกับผู้ใช้

ประโยชน์:

  • โค้ดอ่านง่ายและยืดหยุ่น
  • แยกความรับผิดชอบแต่ละส่วนของโปรแกรมได้ดี

อ้างอิง

ถ้าเข้าใจหลักการนี้ จะทำให้เขียน Node.js ได้คล่องและสนุกขึ้นมาก!

อธิบายทีละบรรทัด

  1. ดึงคลาส EventEmitter จากโมดูล events
  2. สร้างอ็อบเจ็กต์ myEmitter เพื่อใช้จัดการ event
  3. ใช้ .on('greet', ... ) ตั้งให้ฟังเหตุการณ์ชื่อ "greet" ถ้าเกิดขึ้นจะรันฟังก์ชันที่กำหนด
  4. ใช้ .emit('greet') ส่งสัญญาณว่าเหตุการณ์นี้เกิดขึ้นจริง (เหมือนมีคนมากดกริ่ง)

คำศัพท์สำคัญ

  • on: ตั้งให้ฟัง event (เหมือนบอกว่า "ถ้ามีคนมากดกริ่ง ให้ทำแบบนี้นะ")
  • emit: ส่งสัญญาณว่า event เกิดขึ้น (เหมือนมีคนมากดกริ่ง)

Event-driven Programming คืออะไร?

Node.js ใช้แนวคิด event-driven programming หมายถึง "โปรแกรมจะตอบสนองเมื่อมีเหตุการณ์บางอย่างเกิดขึ้น" ไม่ต้องรอทีละบรรทัดแบบเดิมๆ

ตัวอย่างเช่น

  • รับข้อมูลจากผู้ใช้
  • มีไฟล์ใหม่เข้ามา
  • มี error เกิดขึ้น

กรณีใช้งานจริง

  • สื่อสารระหว่างส่วนต่างๆ ของโปรแกรม (เช่น แจ้งเตือนเมื่อโหลดข้อมูลเสร็จ)
  • จัดการกับการคลิก, ส่งข้อมูล, หรือ error
  • สร้างระบบ plugin ที่แต่ละส่วนรอรับ event ของตัวเอง

สรุป

  • Events คือระบบแจ้งเตือนและตอบสนองใน Node.js
  • ช่วยให้โปรแกรมยืดหยุ่นและจัดการกับเหตุการณ์ต่างๆ ได้ง่าย
  • เหมาะกับงานที่ต้องรอข้อมูล หรือมีเหตุการณ์เกิดขึ้นตลอดเวลา

อ้างอิง

ถ้าเข้าใจหลักการนี้ จะทำให้เขียน Node.js ได้คล่องและสนุกขึ้นมาก!