סנכרון, אסינכרוני והבטחות

חשוב לנהל את מחזור החיים של פונקציה כדי לוודא שהיא פועלת בצורה תקינה. אם מסיימים את הפונקציות בצורה נכונה, אפשר להימנע מחיובים מוגזמים על פונקציות שפועלות יותר מדי זמן או שחוזרות על עצמן ללא הפסקה. בנוסף, אפשר לוודא שמופע Cloud Functions שבו הפונקציה פועלת לא נסגר לפני שהפונקציה מגיעה בהצלחה לתנאי או למצב הסיום שלה.

כדי לנהל את מחזור החיים של הפונקציות, מומלץ להשתמש בגישות הבאות:

  • כדי לפתור פונקציות שמבצעות עיבוד אסינכרוני (שנקראות גם 'פונקציות ברקע'), צריך להחזיר הבטחת JavaScript.
  • סיום של פונקציות HTTP באמצעות res.redirect(), res.send() או res.end().
  • מפסיקים פונקציה סינכרונית באמצעות הצהרת return;.

פישוט קוד אסינכרוני באמצעות הבטחות ב-JavaScript

הבטחות הן חלופה מודרנית לקריאות חוזרות (callback) עבור קוד אסינכרוני. אובייקט Promise מייצג פעולה ואת הערך העתידי שהוא עשוי להחזיר. היא גם מאפשרת להפיץ שגיאות בדומה ל-try/catch בקוד סינכרוני. אפשר לקרוא על הבטחות ב-Firebase SDK בבלוג של Firebase, ועל הבטחות באופן כללי ב-MDN.

איך משתמשים ב-promises עם פונקציות

כשמחזירים אובייקט promise של JavaScript לפונקציה, הפונקציה ממשיכה לפעול עד שהאובייקט promise נפתר או נדחה. כדי לציין שפונקציה השלימה את העבודה שלה בהצלחה, צריך להשלים את ההבטחה. כדי לציין שגיאה, צריך לדחות את ההבטחה. כלומר, אתם צריכים לטפל רק בשגיאות שאתם רוצים.

הקוד הבא לוקח 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 דוגמאות הקוד שלנו כוללות דוגמאות לסיום תקין של פונקציה. הנה כמה דוגמאות שממחישות מקרים טיפוסיים: