Synchronisiert, asynchron und verspricht

Es ist wichtig, den Lebenszyklus einer Funktion zu verwalten, damit sie richtig aufgelöst wird. Wenn Sie Funktionen richtig beenden, können Sie übermäßige Gebühren für Funktionen vermeiden, die zu lange ausgeführt werden oder in einer Endlosschleife hängen bleiben. Außerdem können Sie dafür sorgen, dass die Cloud Functions-Instanz, auf der Ihre Funktion ausgeführt wird, nicht heruntergefahren wird, bevor Ihre Funktion ihren Beendigungszustand erreicht hat.

Mit diesen empfohlenen Methoden können Sie den Lebenszyklus Ihrer Funktionen verwalten:

  • Lösen Sie Funktionen auf, die asynchrone Verarbeitung ausführen (auch als „Hintergrundfunktionen“ bezeichnet), indem Sie ein JavaScript-Promise zurückgeben.
  • Beenden Sie HTTP-Funktionen mit res.redirect(), res.send() oder res.end().
  • Beenden Sie eine synchrone Funktion mit einer return;-Anweisung.

Asynchronen Code mit JavaScript-Promises vereinfachen

Promises sind eine moderne Alternative zu Callbacks für asynchronen Code. Ein Promise stellt einen Vorgang und den zukünftigen Wert dar, den er möglicherweise zurückgibt. Außerdem können Sie Fehler ähnlich wie bei try/catch in synchronem Code weitergeben. Weitere Informationen zu Promises im Firebase SDK finden Sie im Firebase-Blog und zu Promises im Allgemeinen auf MDN.

Funktionsweise von Promises mit Funktionen

Wenn Sie ein JavaScript-Promise für eine Funktion zurückgeben, wird diese Funktion so lange ausgeführt, bis das Promise erfüllt oder abgelehnt wird. Um anzugeben, dass eine Funktion ihre Arbeit erfolgreich abgeschlossen hat, sollte das Promise aufgelöst werden. Um einen Fehler anzugeben, sollte das Promise abgelehnt werden. Das bedeutet, dass Sie nur die Fehler behandeln müssen, die Sie möchten.

Im folgenden Code wird ein Firebase Realtime Database ref verwendet und sein Wert auf "world!" festgelegt. Wenn Sie das Ergebnis von set zurückgeben, wird Ihre Funktion garantiert so lange ausgeführt, bis die asynchrone Aufgabe, den String in die Datenbank zu schreiben, vollständig abgeschlossen ist:

// 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!');
  });
});

Beispiele im Kontext

Die meisten unserer Cloud Functions Codebeispiele enthalten Beispiele für den ordnungsgemäßen Abschluss von Funktionen. Hier einige Beispiele für typische Fälle: