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

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

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

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

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

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

איך הבטחות פועלות עם פונקציות

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