חשוב לנהל את מחזור החיים של פונקציה כדי לוודא שהיא נפתרת בצורה תקינה. אם מסיימים את הפונקציות בצורה נכונה, אפשר להימנע מחיובים מוגזמים על פונקציות שפועלות יותר מדי זמן או שחוזרות על עצמן ללא הפסקה. בנוסף, אפשר לוודא שמופע Cloud Functions שבו הפונקציה פועלת לא נסגר לפני שהפונקציה מגיעה בהצלחה לתנאי או למצב הסיום שלה.
כדי לנהל את מחזור החיים של הפונקציות, מומלץ להשתמש בגישות הבאות:
- כדי לפתור פונקציות שמבצעות עיבוד אסינכרוני (שנקראות גם 'פונקציות ברקע'), צריך להחזיר הבטחה (promise) של JavaScript.
- סיום של פונקציות HTTP עם
res.redirect(),res.send()אוres.end(). - מפסיקים פונקציה סינכרונית באמצעות הצהרת
return;.
פישוט קוד אסינכרוני באמצעות הבטחות ב-JavaScript
הבטחות הן חלופה מודרנית לקריאות חוזרות (callbacks) בקוד אסינכרוני. הבטחה מייצגת פעולה ואת הערך העתידי שהיא עשויה להחזיר. היא גם מאפשרת להפיץ שגיאות באופן דומה ל-try/catch בקוד סינכרוני. אפשר לקרוא על הבטחות ב-Firebase SDK בבלוג של Firebase, ועל הבטחות באופן כללי ב-MDN.
איך משתמשים ב-promises עם פונקציות
כשמחזירים אובייקט promise של JavaScript לפונקציה, הפונקציה ממשיכה לפעול עד שהאובייקט promise מותאם או נדחה. כדי לציין שפונקציה השלימה את העבודה שלה בהצלחה, צריך להגדיר את ה-Promise כ-resolved. כדי לציין שגיאה, צריך לדחות את ההבטחה. כלומר, אתם צריכים לטפל רק בשגיאות שאתם רוצים.
הקוד הבא מקבל Firebase Realtime Database ref ומגדיר את הערך שלו ל-"world!". הפונקציה מחזירה את התוצאה של set, ולכן היא תמשיך לפעול עד שהעבודה האסינכרונית של כתיבת המחרוזת למסד הנתונים תושלם:
// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
// set() returns a promise. We keep the function alive by returning it.
return event.data.ref.set('world!').then(() => {
console.log('Write succeeded!');
});
});
דוגמאות בהקשר
רוב Cloud Functions דוגמאות הקוד שלנו כוללות דוגמאות לסיום תקין של פונקציות. הנה כמה דוגמאות שממחישות מקרים אופייניים:
- טריגר של מסד נתונים בזמן אמת: פונקציית HTTP ואחריה הפניה לכתובת אחרת
- טריגר של Cloud Storage:
הורדה מאחסון ואחריה
then - Webhook on Realtime Database
write:
An error thrown inside a
thenclause - מחיקה תקופתית של חשבונות לא פעילים: הבטחה שנדחתה