Dark mode
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):
- นำเข้า EventEmitter จาก 'node:events' ด้วย import (ES Modules)
- สร้างอ็อบเจ็กต์ myEmitter เพื่อใช้จัดการ event
- ใช้
.on('greet', ... )
ตั้งให้ฟังเหตุการณ์ชื่อ "greet" ถ้าเกิดขึ้นจะรันฟังก์ชันที่กำหนด - ใช้
.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 ได้คล่องและสนุกขึ้นมาก!
อธิบายทีละบรรทัด
- ดึงคลาส EventEmitter จากโมดูล events
- สร้างอ็อบเจ็กต์ myEmitter เพื่อใช้จัดการ event
- ใช้
.on('greet', ... )
ตั้งให้ฟังเหตุการณ์ชื่อ "greet" ถ้าเกิดขึ้นจะรันฟังก์ชันที่กำหนด - ใช้
.emit('greet')
ส่งสัญญาณว่าเหตุการณ์นี้เกิดขึ้นจริง (เหมือนมีคนมากดกริ่ง)
คำศัพท์สำคัญ
- on: ตั้งให้ฟัง event (เหมือนบอกว่า "ถ้ามีคนมากดกริ่ง ให้ทำแบบนี้นะ")
- emit: ส่งสัญญาณว่า event เกิดขึ้น (เหมือนมีคนมากดกริ่ง)
Event-driven Programming คืออะไร?
Node.js ใช้แนวคิด event-driven programming หมายถึง "โปรแกรมจะตอบสนองเมื่อมีเหตุการณ์บางอย่างเกิดขึ้น" ไม่ต้องรอทีละบรรทัดแบบเดิมๆ
ตัวอย่างเช่น
- รับข้อมูลจากผู้ใช้
- มีไฟล์ใหม่เข้ามา
- มี error เกิดขึ้น
กรณีใช้งานจริง
- สื่อสารระหว่างส่วนต่างๆ ของโปรแกรม (เช่น แจ้งเตือนเมื่อโหลดข้อมูลเสร็จ)
- จัดการกับการคลิก, ส่งข้อมูล, หรือ error
- สร้างระบบ plugin ที่แต่ละส่วนรอรับ event ของตัวเอง
สรุป
- Events คือระบบแจ้งเตือนและตอบสนองใน Node.js
- ช่วยให้โปรแกรมยืดหยุ่นและจัดการกับเหตุการณ์ต่างๆ ได้ง่าย
- เหมาะกับงานที่ต้องรอข้อมูล หรือมีเหตุการณ์เกิดขึ้นตลอดเวลา
อ้างอิง
ถ้าเข้าใจหลักการนี้ จะทำให้เขียน Node.js ได้คล่องและสนุกขึ้นมาก!