การเขียนโปรแกรมแบบ Asynchronous ใน Node.js เป็นส่วนสำคัญของฟังก์ชันการทำงาน ทำให้สามารถดำเนินการแบบ non-blocking และมีประสิทธิภาพสูงได้ ไวยากรณ์ async/await ที่เปิดตัวใน ES2017 ได้ปฏิวัติวิธีการที่นักพัฒนาเขียนโค้ดแบบ asynchronous
ทำความเข้าใจ NodeJs
Node.js คือสภาพแวดล้อมรันไทม์ของ JavaScript ที่ช่วยให้คุณสามารถรันโค้ด JavaScript นอกเบราว์เซอร์ได้ Node.js สร้างขึ้นบน Google Chrome V8 JavaScript engine และใช้สำหรับการสร้างเว็บแอปพลิเคชัน โดยเฉพาะอย่างยิ่งแอปพลิเคชันที่เน้นข้อมูลและแบบเรียลไทม์ Node.js ยังมีไลบรารีของโมดูลและแพ็คเกจจำนวนมากที่คุณสามารถใช้เพื่อเพิ่มฟังก์ชันการทำงานให้กับโปรเจกต์ของคุณได้ ข้อดีบางประการของ Node.js ได้แก่:
- รวดเร็วและปรับขนาดได้ ด้วยธรรมชาติแบบ asynchronous และ event-driven
- เป็นแบบ cross-platform และ open-source ซึ่งหมายความว่าคุณสามารถรันบนระบบปฏิบัติการต่างๆ และมีส่วนร่วมในการพัฒนาได้
- มีความสอดคล้องและเป็นหนึ่งเดียว เนื่องจากคุณสามารถใช้ภาษาเดียวกันได้ทั้ง front-end และ back-end ของเว็บแอปพลิเคชันของคุณ

Promises คืออะไร?
ใน JavaScript, Promise คืออ็อบเจกต์ที่แสดงถึงการดำเนินการแบบ asynchronous ที่จะเสร็จสมบูรณ์ (หรือล้มเหลว) ในที่สุดและค่าที่ได้จากการดำเนินการนั้น ช่วยให้คุณทำงานกับการดำเนินการแบบ asynchronous ได้อย่าง synchronous มากขึ้น นี่คือรายละเอียดว่า Promise คืออะไรและทำงานอย่างไร:
States: Promise อยู่ในสถานะใดสถานะหนึ่งเหล่านี้:
pending
: สถานะเริ่มต้น ยังไม่สำเร็จหรือถูกปฏิเสธfulfilled
: การดำเนินการเสร็จสมบูรณ์rejected
: การดำเนินการล้มเหลว- Usage: คุณสามารถเชื่อมโยงตัวจัดการกับค่าความสำเร็จหรือเหตุผลที่ล้มเหลวของการดำเนินการแบบ asynchronous ได้ ซึ่งช่วยให้เมธอดแบบ asynchronous ส่งคืนค่าเหมือนกับเมธอดแบบ synchronous: แทนที่จะส่งคืนค่าสุดท้ายทันที เมธอดแบบ asynchronous จะส่งคืน promise เพื่อให้ค่าในอนาคต
- Settling: Promise จะถูกกล่าวว่า settled หากสำเร็จหรือถูกปฏิเสธ แต่ยังไม่ pending สถานะสุดท้ายของ promise ที่ pending สามารถสำเร็จด้วยค่าหรือถูกปฏิเสธด้วยเหตุผล (ข้อผิดพลาด)
วิธีการประกาศฟังก์ชัน Async
การประกาศฟังก์ชัน async
ใน JavaScript นั้นง่ายมาก คุณเพียงแค่ใส่คำว่า async
นำหน้าการประกาศฟังก์ชัน ซึ่งเป็นการส่งสัญญาณว่าฟังก์ชันนั้นเป็นแบบ asynchronous และสามารถมีนิพจน์ await
หนึ่งรายการขึ้นไปได้ นี่คือไวยากรณ์พื้นฐาน:
async function functionName(parameters) {
// function body
}
นี่คือตัวอย่างของฟังก์ชัน async
ที่ดึงข้อมูลจาก API:
async function fetchData(url) {
try {
const response = await fetch(url);
const data = await response.json();
return data;
} catch (error) {
console.error('An error occurred:', error);
}
}
ในตัวอย่างนี้ fetchData
คือฟังก์ชัน async
ที่ใช้ await
เพื่อรอให้การเรียก fetch
แก้ไขก่อนดำเนินการต่อ หากการเรียก fetch
สำเร็จ จะประมวลผลการตอบสนองและส่งคืนข้อมูล หากมีข้อผิดพลาด จะถูกจับและบันทึกลงในคอนโซล
Await คืออะไร?
คำสำคัญ await
ใน JavaScript ใช้ภายในฟังก์ชัน async
เพื่อหยุดการดำเนินการของฟังก์ชันจนกว่า Promise
จะได้รับการแก้ไข เมื่อคุณใช้ await
ฟังก์ชันจะรอให้ Promise
settle จากนั้นจึงดำเนินการต่อด้วยผลลัพธ์ของ Promise
หาก Promise
ถูกปฏิเสธ นิพจน์ await
จะโยนค่าที่ถูกปฏิเสธ ทำให้คุณสามารถจัดการได้ด้วยบล็อก try
/catch
นี่คือตัวอย่างง่ายๆ เพื่อสาธิต await
:
async function getUserData() {
try {
let response = await fetch('/user/data');
let data = await response.json();
console.log(data);
} catch (error) {
console.error('An error occurred:', error);
}
}
getUserData();
ในตัวอย่างนี้ getUserData
คือฟังก์ชัน async
ที่ดึงข้อมูลผู้ใช้ คำสำคัญ await
ใช้เพื่อรอให้การเรียก fetch
แก้ไขก่อนดำเนินการต่อไปยังบรรทัดถัดไป ซึ่งยังใช้ await
เพื่อรอให้การเรียก response.json()
แก้ไข หาก promise ใดๆ เหล่านี้ถูกปฏิเสธ ข้อผิดพลาดจะถูกจับในบล็อก catch

ทำไมต้องใช้ Async/Await?
การใช้ async
และ await
ในการเขียนโปรแกรม โดยเฉพาะอย่างยิ่งใน NodeJs มีข้อดีหลายประการ:
- ทำให้โค้ด Asynchronous ง่ายขึ้น: ช่วยให้คุณเขียนโค้ดแบบ asynchronous ที่ดูและมีพฤติกรรมคล้ายกับโค้ด synchronous ทำให้เข้าใจและบำรุงรักษาได้ง่ายขึ้น
- ปรับปรุงการอ่านได้: โดยหลีกเลี่ยงสถานการณ์ "callback hell" หรือ "pyramid of doom" ซึ่งคุณมี callback ที่ซ้อนกันหลายรายการ โค้ดจะสะอาดและอ่านง่ายขึ้น
- การจัดการข้อผิดพลาด: ช่วยให้จัดการข้อผิดพลาดได้ดีขึ้นด้วยบล็อก try/catch ซึ่งคล้ายกับโค้ด synchronous ซึ่งไม่ตรงไปตรงมาเท่ากับการใช้วิธีการแบบ callback-based แบบดั้งเดิม
- การควบคุมการไหล: ช่วยให้คุณควบคุมการไหลของการดำเนินการแบบ asynchronous ได้ดีขึ้น ทำให้คุณสามารถเขียนโค้ดที่ดำเนินการในลักษณะที่คาดการณ์ได้มากขึ้น
- Non-Blocking:
await
หยุดการดำเนินการของฟังก์ชัน async และรอให้ Promise แก้ไขโดยไม่บล็อก thread หลัก ทำให้การดำเนินการอื่นๆ ดำเนินต่อไปในพื้นหลังได้
การจัดการข้อผิดพลาดด้วย Async/Await
การจัดการข้อผิดพลาดด้วย async
/await
ใน JavaScript นั้นตรงไปตรงมาและคล้ายกับการจัดการข้อผิดพลาดแบบ synchronous โดยใช้บล็อก try
/catch
นี่คือวิธีที่คุณสามารถจัดการข้อผิดพลาดในฟังก์ชัน async
:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
fetchData();
ในตัวอย่างข้างต้น หากการเรียก fetch
ล้มเหลว หรือหากมีข้อผิดพลาดในการแยกวิเคราะห์ JSON ข้อผิดพลาดจะถูกจับในบล็อก catch
ซึ่งช่วยให้สามารถจัดการข้อผิดพลาดแบบรวมศูนย์ ซึ่งมีประโยชน์อย่างยิ่งเมื่อจัดการกับการดำเนินการแบบ asynchronous หลายรายการ
โปรดจำไว้ว่า การปฏิเสธ promise ที่ไม่ได้จัดการยังคงเกิดขึ้นได้หากข้อผิดพลาดไม่ถูกจับอย่างถูกต้อง สิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่า promise ทุกรายการมีตัวจัดการ .catch()
หรืออยู่ในบล็อก try
/catch
ในฟังก์ชัน async
เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นในแอปพลิเคชันของคุณ
Async/Await กับ Apidog
Apidog ไม่ใช่แค่แพลตฟอร์มการพัฒนา API เท่านั้น แต่เป็นชุดเครื่องมือที่ครอบคลุมซึ่งช่วยปรับปรุงวงจรชีวิต API ทั้งหมด ด้วยแนวทาง design-first Apidog ช่วยให้มั่นใจได้ว่า API ของคุณไม่เพียงแต่ใช้งานได้จริงเท่านั้น แต่ยังใช้งานง่ายและเป็นมิตรกับผู้ใช้อีกด้วย
การใช้ async/await กับ Apidog ช่วยเพิ่มประสิทธิภาพในการจัดการคำขอและคำตอบ API ช่วยให้นักพัฒนาสามารถเขียนโค้ดที่สะอาดและอ่านง่าย ทำให้การแก้ไขข้อบกพร่องเป็นเรื่องง่าย

บทสรุป
Async/await ใน Node.js เป็นคุณสมบัติที่มีประสิทธิภาพที่ช่วยลดความซับซ้อนในการเขียนโค้ดแบบ asynchronous ด้วยการทำความเข้าใจและใช้ไวยากรณ์นี้ นักพัฒนาสามารถเขียนแอปพลิเคชันที่มีประสิทธิภาพ อ่านง่าย และบำรุงรักษาได้มากขึ้น