Async/await ใน TypeScript
บทความนี้อธิบายเรื่อง async/await ใน TypeScript
YouTube Video
Async/await ใน TypeScript
ใน TypeScript, คำสำคัญ async ใช้สำหรับอธิบายการทำงานแบบอะซิงโครนัสอย่างย่อ และมีพฤติกรรมคล้ายคลึงกับไวยากรณ์ async/await ของ JavaScript ฟังก์ชัน async ได้รับการออกแบบมาเพื่อทำให้การจัดการฟังก์ชันที่คืนค่า Promises เข้าใจง่ายขึ้น
พื้นฐานของฟังก์ชัน async
ฟังก์ชันที่ประกาศด้วยคำสำคัญ async จะคืนค่า Promise เสมอ ตัวอย่างพื้นฐานมีดังนี้:
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
ในตัวอย่างนี้ เนื่องจากฟังก์ชัน async คืนค่า Promise เสมอ ค่ารีเทิร์นถูกรีโซลฟ์โดยอัตโนมัติด้วย Promise.resolve กล่าวอีกนัยหนึ่ง "Data received" จะกลายเป็น Promise<string> และถูกจัดการเป็นการดำเนินการแบบอะซิงโครนัส
คำสำคัญ await
คำสำคัญ await สามารถใช้ได้เฉพาะภายในฟังก์ชัน async เท่านั้น สิ่งนี้ช่วยให้สามารถหยุดและรอผลลัพธ์ของ Promise ก่อนที่จะดำเนินการฟังก์ชันต่อไปได้
ในตัวอย่างต่อไปนี้ การประมวลผลแบบอะซิงโครนัสโดยใช้ fetch เขียนโดยใช้ async/await
1async function getUserData() {
2 try {
3 const response = await fetch("https://codesparklab.com/json/example.json");
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("Error fetching user data:", error);
8 }
9}
10
11getUserData();ในตัวอย่างนี้ await ถูกใช้เพื่อรอการเสร็จสิ้นของ Promise ที่คืนค่าโดยฟังก์ชัน fetch และผลลัพธ์ถูกกำหนดให้ตัวแปร response นอกจากนี้ ผลลัพธ์ของ response.json() ยังถูกคอยด้วย await
การจัดการข้อผิดพลาดด้วย async/await
ข้อผิดพลาดที่เกิดขึ้นระหว่างการประมวลผลแบบอะซิงโครนัสสามารถจับได้โดยใช้ไวยากรณ์มาตรฐาน try...catch หากเกิดข้อผิดพลาดที่ส่วน await ข้อผิดพลาดนั้นจะถูกจัดการในบล็อก catch
1async function fetchDataWithErrorHandling() {
2 try {
3 const response = await fetch('https://invalid.codesparklab.com/');
4 if (!response.ok) {
5 throw new Error(`HTTP error! status: ${response.status}`);
6 }
7 const data = await response.json();
8 console.log(data);
9 } catch (error) {
10 console.error("Fetch error:", error);
11 }
12}
13
14fetchDataWithErrorHandling();ในตัวอย่างข้างต้น ผลลัพธ์ของฟังก์ชัน fetch ถูกคอยโดยใช้ await และหากเกิดข้อผิดพลาด มันจะถูกจัดการด้วย try...catch
ข้อดีของ async/await
-
การประมวลผลแบบอะซิงโครนัสที่เข้าใจง่าย: การใช้
async/awaitทำให้การไหลของโค้ดเข้าใจง่ายกว่าการใช้เชนของPromise(thenหรือcatch) และสามารถเขียนให้อยู่ในรูปแบบคล้ายกับการประมวลผลแบบซิงโครนัส -
การจัดการข้อผิดพลาดที่ง่ายดาย: การใช้
try...catchทำให้การจัดการข้อผิดพลาดในกระบวนการอะซิงโครนัสง่ายขึ้น สามารถเขียนโค้ดให้อ่านง่ายขึ้นกว่าการใช้เชนของPromise
ค่าที่คืนโดยฟังก์ชัน async
ฟังก์ชัน async จะคืนค่าเป็น Promise เสมอ ดังนั้น แม้จะไม่มีการคืนค่า Promise อย่างชัดเจน ก็สามารถดำเนินการแบบอะซิงโครนัสได้โดยใช้คีย์เวิร์ด async
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
ในโค้ดด้านบน คืนค่าตัวเลขซิงโครนัส 42 แต่เนื่องจากอยู่ในฟังก์ชัน async จึงถูกแปลงเป็น Promise.resolve(42) โดยอัตโนมัติ
การดำเนินงานตามลำดับของฟังก์ชันอะซิงโครนัส
เมื่อดำเนินการฟังก์ชันอะซิงโครนัสหลายฟังก์ชันต่อเนื่องกัน คุณสามารถใช้ await เพื่อควบคุมลำดับ
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function processData() {
19 const data1 = await fetchData1();
20 console.log(data1);
21
22 const data2 = await fetchData2();
23 console.log(data2);
24}
25
26processData();ในตัวอย่างนี้ fetchData2 จะทำงานหลังจากรอให้ fetchData1 เสร็จสิ้น เรื่องนี้อ่านง่ายกว่าการใช้ Promise chain
การดำเนินงานแบบขนาน
หากต้องการดำเนินการแบบอะซิงโครนัสพร้อมกัน คุณสามารถใช้ Promise.all เพื่อจัดการกับ Promises หลายตัวพร้อมกัน
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function fetchMultipleData() {
19 const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
20 console.log(data1);
21 console.log(data2);
22}
23
24fetchMultipleData();ในกรณีนี้ fetchData1 และ fetchData2 จะทำงานพร้อมกัน และกระบวนการจะดำเนินต่อไปหลังจากทั้งสองเสร็จสิ้น วิธีนี้ช่วยให้จัดการกับการดำเนินงานแบบอะซิงโครนัสหลายรายการได้อย่างมีประสิทธิภาพ
สรุป
- ฟังก์ชัน
asyncจะคืนค่าเป็นPromiseและโดยการใช้คีย์เวิร์ดawaitคุณสามารถรอผลของการดำเนินงานแบบอะซิงโครนัสได้ - โดยการใช้
try...catchการจัดการข้อผิดพลาดในกระบวนการอะซิงโครนัสจะง่ายขึ้น - โดยการใช้
Promise.allเป็นไปได้ที่จะดำเนินการแบบอะซิงโครนัสหลายรายการพร้อมกัน
async/await มีการใช้อย่างแพร่หลายใน TypeScript และ JavaScript เนื่องจากสามารถอธิบายการดำเนินงานอะซิงโครนัสได้ง่ายขึ้น
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย