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() גם כן ממתינים לה.
טיפול בשגיאות עם 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();בדוגמה שלמעלה, נעשה שימוש ב-await להמתין לתוצאה של פונקציית fetch, ואם מתרחשת שגיאה, היא מטופלת באמצעות 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.
ביצוע מקבילי
אם אתם רוצים לבצע פעולות אסינכרוניות במקביל, ניתן להשתמש ב-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 בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.