שאלה שמטרידה אותי מזמן, וכעת נהייתה לי משמעותית.
כידוע, JS היא סנכרונית, מה שאומר ש2 פעולות יכולות להתבצע בו זמנית, הקוד שמריץ את הפעולה השניה יופעל בלי להמתין לסיום הפעולה הקודמת.
אמנם, זה נכון לגבי סוגים מסוימים של פעולות, כאלו שדורשות תקשורת עם שרת או IO בצורה כלשהי. לוגיקה רגילה רצה שורה אחרי שורה כמו קוד רגיל.
הפרומיסים (עם הawait) החדש גורמים גם לקוד סינכרוני להתנהג בצורה אסינכרונית, למשל להמתין לתשובת השרת לפני המעבר להמשך הקוד. זו כמובן התנהגות שמאיטה את ריצת הקוד, ולפעמים מאיטה משמעותית.
ומכאן לשאלה:
מה קורה עם אני משתמש בפרומיס, אך מכניס בתוכו קוד שממילא היה פועל באופן אסינכרוני. האם יש לזה משמעות מבחינת זמן ריצה של הקוד?
למשל, האם בקוד הבא, הראשון יהיה יעיל פחות מבחינה כלשהי מאשר השני:
async function doSomthimg() {
let a = 0;
for (let i = 0; i < 100; i++) a++;
return a;
}
router.get("/", async (req, res, next) => {
let result = await doSomthimg();
res.send(result);
});
השתמשתי בדוגמה הפשוטה ביותר, שכן הוספת async
לפוקנציה בעצם הופכת אותה לפרומיס.
לעומת
function doSomthimg() {
let a = 0;
for (let i = 0; i < 100; i++) a++;
return a;
}
router.get("/", async (req, res, next) => {
let result = doSomthimg();
res.send(result);
});
(את הasync
בשורה 7 בדוגמה האחרונה השארתי בכונה).
האם בדוגמה השניה הראוטר יחזיר את תוצאת הפונקציה יותר מהר, או יחסוך בעיה אחרת?
הנפקא מינא הבסיסית פשוטה מאוד. אם יש לי קוד, שבמצבים מסוימים נדרש להמתין לפרומיסים ובמצבים אחרים לא, האם יש ענין להתאמץ לחלק את הקוד כך שלא יפגוש async/await מיותרים?
אני לא מדבר על מקרה שזה זניח, אלא מקרה שזה משמעותי כמותית הן מבחינת כמות הקריאות והן מבחינת מבנה הקוד.