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

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

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

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

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

הבטחות (promises) הן חלופה מודרנית להפעלות חוזרות (callbacks) בקוד אסינכרוני. הבטחה מייצגת פעולה ואת הערך העתידי שהיא עשויה להחזיר. הוא גם מאפשר להעביר שגיאות באופן דומה ל-try/catch בקוד סינכרוני. מידע נוסף על הבטחות ב-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 כוללות דוגמאות לסיום תקין של פונקציות. ריכזנו כאן כמה דוגמאות לתרחישים טיפוסיים: