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()
oderres.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:
- Realtime Database-Trigger: Eine HTTP-Funktion, gefolgt von einer Weiterleitung
- Cloud Storage-Trigger:
Ein Speicher-Download gefolgt von
then
- Webhook bei Realtime Database-Schreibvorgang:
Ein Fehler, der in einer
then
-Klausel ausgegeben wird - Nicht verwendete Konten regelmäßig löschen: Ein abgelehntes Versprechen