Synchronisiert, asynchron und verspricht

Es ist wichtig, den Lebenszyklus einer Funktion zu verwalten, damit sie ordnungsgemäß aufgelöst wird. Wenn Sie Funktionen korrekt beenden, können Sie übermäßige Kosten durch Funktionen vermeiden, die zu lange ausgeführt werden oder in einer Endlosschleife laufen. Außerdem können Sie dafür sorgen, dass die Cloud Functions-Instanz, auf der Ihre Funktion ausgeführt wird, nicht heruntergefahren wird, bevor die Funktion ihre Beendigungsbedingung oder ihren Beendigungsstatus erreicht hat.

Verwenden Sie die folgenden empfohlenen Ansätze, um den Lebenszyklus Ihrer Funktionen zu verwalten:

  • Lösen Sie Funktionen auf, die eine 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. 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 an eine Funktion zurückgeben, wird diese Funktion so lange ausgeführt, bis das Promise aufgelöst oder abgelehnt wird. Um anzugeben, dass eine Funktion ihre Arbeit erfolgreich abgeschlossen hat, sollte das Promise aufgelöst werden. Um einen Fehler anzuzeigen, sollte das Promise abgelehnt werden. Sie müssen also nur die Fehler behandeln, die Sie behandeln möchten.

Der folgende Code verwendet einen Firebase Realtime Database ref und setzt seinen Wert auf "world!". Wenn Sie das Ergebnis von set zurückgeben, wird die Funktion garantiert so lange ausgeführt, bis die asynchrone Arbeit des Schreibens des Strings in die Datenbank 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 die ordnungsgemäße Beendigung von Funktionen. Hier sind einige Beispiele für typische Fälle: