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

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

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

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

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

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

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

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