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

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

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

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

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

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

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

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

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