12/04/2026 18:17น.

JS2GO EP.19 การทำงานกับ Events ใน JavaScript และ Go – Event Loop, Goroutines และ Channels
#Concurrent Programming
#Channels
#Goroutines
#Event Loop
#Go Events
#JavaScript Events
การจัดการ Events เป็นหัวใจสำคัญในการพัฒนาโปรแกรม ไม่ว่าจะเป็นการโต้ตอบกับผู้ใช้ การประมวลผลแบบ Asynchronous หรือระบบที่ทำงานแบบเรียลไทม์ ในบทความนี้เราจะเปรียบเทียบการทำงานกับ Events ใน JavaScript และ Go พร้อมเรียนรู้แนวทางปฏิบัติที่ดีที่สุดสำหรับแต่ละภาษา เพื่อช่วยให้การพัฒนาระบบของคุณมีประสิทธิภาพและลดข้อผิดพลาด
การจัดการ Events ใน JavaScript
1. Event-driven Programming ใน JavaScript
JavaScript เป็นภาษาที่ Event-driven โดยเฉพาะบนเว็บเบราว์เซอร์ ตัวอย่างเช่น การคลิกปุ่ม การพิมพ์ข้อความ หรือการโหลดหน้าเว็บ
ตัวอย่างการฟัง Event ด้วย addEventListener:
const button = document.querySelector("#myButton");
button.addEventListener("click", () => {
console.log("Button clicked!");
});
การจัดการ Event แบบ Asynchronous ด้วย Promises และ async/await:
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Data loaded");
}, 1000);
});
}
async function loadData() {
const data = await fetchData();
console.log(data);
}
loadData();
2. Event Loop ใน JavaScript
JavaScript มี Event Loop ที่ช่วยให้ฟังก์ชัน asynchronous ทำงานแบบ non-blocking ฟังก์ชันเหล่านี้จะถูกจัดคิวและประมวลผลหลังจากงาน synchronous เสร็จสิ้น
ข้อดี:
- ทำงานกับ Event ได้อย่างยืดหยุ่น
- รองรับการทำงานแบบ Asynchronous
ข้อเสีย:
- ต้องเข้าใจ Event Loop เพื่อหลีกเลี่ยงปัญหา callback hell หรือ race condition
การจัดการ Events ใน Go
1. Event Handling ใน Go
Go เป็นภาษาที่เน้น Concurrency การจัดการ Event มักใช้ Goroutines และ Channels เพื่อสื่อสารระหว่าง processes
ตัวอย่างการใช้งาน Goroutine และ Channel:
package main
import (
"fmt"
"time"
)
func main() {
events := make(chan string)
go func() {
time.Sleep(1 * time.Second)
events <- "Event received!"
}()
msg := <-events
fmt.Println(msg)
}
คำอธิบาย:
eventsเป็น Channel สำหรับส่งข้อมูลระหว่าง Goroutines- Goroutine ทำงานแบบ Concurrent
- การรับค่า
msg := <-eventsจะรอจนกว่ามีข้อมูลส่งเข้ามา
2. Event-driven Pattern ใน Go
Go ไม่มีระบบ Event Loop แบบ JavaScript การทำงานแบบ Event-driven ต้องสร้างโครงสร้างเอง เช่น ใช้ select กับ Channels
select {
case msg := <-events:
fmt.Println(msg)
case <-time.After(2 * time.Second):
fmt.Println("Timeout")
}
ข้อดี:
- Concurrency ของ Go ทำงานได้เร็วและปลอดภัยต่อ Thread
- จัดการหลาย Event พร้อมกันได้ง่ายด้วย Channels
ข้อเสีย:
- ต้องเข้าใจ Goroutines และ Channels
- ต้องออกแบบโครงสร้าง Event-driven เอง
เปรียบเทียบการจัดการ Events: JavaScript vs Go
| Feature | JavaScript | Go |
|---|---|---|
| หลักการทำงาน | Event Loop, Non-blocking | Goroutines + Channels, Concurrency |
| การจัดการ Event แบบ Async | Promises, async/await | Goroutines + Channels |
| ความง่ายในการเริ่มต้น | ง่ายสำหรับ Web UI และ Node.js | ต้องเข้าใจ Concurrency และ Channels |
| การทำงานพร้อมกัน | Non-blocking แต่ต้องระวัง race conditions | รองรับหลาย Event พร้อมกันได้ดี |
| การใช้งานเหมาะกับ | Web Applications, Asynchronous I/O | Server, Backend, Concurrent Processing |
แนวทางปฏิบัติที่ดีที่สุด
JavaScript
- ใช้
addEventListenerหรือon[event]สำหรับ DOM Events - ใช้
Promisesหรือasync/awaitแทน callback ซ้อนกัน - ระวัง race condition และ state management เมื่อทำงานแบบ asynchronous
Go
- ใช้ Goroutines สำหรับงานที่ทำพร้อมกัน
- ใช้ Channels สำหรับส่งและรับ Event ระหว่าง Goroutines
- ใช้
selectเพื่อจัดการหลาย Event หรือ Timeout - ออกแบบ Event-driven system ให้เหมาะสมกับ concurrency ของโปรแกรม
สรุป
- JavaScript เหมาะกับ Event-driven programming บนเว็บและ Node.js โดยใช้ Event Loop และ async/await
- Go เหมาะกับ Concurrent Event Handling ด้วย Goroutines และ Channels สำหรับงาน backend และ server
การเลือกวิธีจัดการ Event ขึ้นอยู่กับ ลักษณะโปรเจกต์ และ ภาษา ที่ใช้ การเข้าใจหลักการ Event ของแต่ละภาษา จะช่วยให้การพัฒนาระบบมีประสิทธิภาพ ลดข้อผิดพลาด และเพิ่มความเสถียรของโปรเจกต์
ตอนต่อไป
ใน EP.20 ของซีรีส์ JS2GO เราจะพาคุณไปเรียนรู้เกี่ยวกับ การใช้ Testing ใน Go และ JavaScript เพื่อให้คุณสามารถสร้างโค้ดที่มีคุณภาพ ปลอดภัย และมั่นใจได้ว่าทำงานถูกต้อง
อ่านบทความ Series อื่นๆ
🔵 Facebook: https://www.facebook.com/superdev.academy.th
🔴 YouTube : Superdev Academy
📸 Instagram: Superdev Academy
🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH
🌐 Website: https://www.superdevacademy.com/