Ważne jest zarządzanie cyklem życia funkcji, aby zapewnić jej prawidłowe działanie. Prawidłowe zamykanie funkcji pozwala uniknąć nadmiernych opłat za funkcje, które działają zbyt długo lub w nieskończoność. Możesz też sprawdzić, czy instancja Cloud Functions, która wykonuje funkcję, nie zostanie zamknięta, zanim funkcja nie osiągnie odpowiedniego stanu.
Aby zarządzać cyklem życia funkcji, stosuj te zalecane podejścia:
- Rozwiązywanie funkcji, które wykonują przetwarzanie asynchroniczne (nazywane też „funkcjami tła”), zwracając obietnice JavaScriptu.
- Zakończ funkcje HTTP za pomocą instrukcji
res.redirect()
,res.send()
lubres.end()
. - Zakończ synchroniczną funkcję za pomocą instrukcji
return;
.
Upraszczanie kodu asynchronicznego za pomocą obietnic JavaScript
Obietnice to nowoczesna alternatywa dla wywołań zwrotnych w przypadku kodu asynchronicznego. Obietnica reprezentuje operację i wartość przyszłą, którą może zwrócić. Pozwala też rozpowszechniać błędy w sposób podobny do try/catch w kodzie synchronicznym. Informacje o obietnicach w pakiecie SDK Firebase znajdziesz w blogu Firebase, a o ogólnych zasadach działania obietnic – w MDN.
Jak obietnice działają z funkcjami
Gdy zwracasz obietnicę JavaScriptu do funkcji, ta funkcja będzie działać, dopóki obietnica nie zostanie spełniona lub odrzucona. Aby wskazać, że funkcja zakończyła działanie, należy rozwiązać obietnicę. Aby wskazać błąd, należy odrzucić obietnicę. Oznacza to, że musisz obsługiwać tylko te błędy, które Cię interesują.
Podany niżej kod przyjmuje element Firebase Realtime Database ref
i ustawia jego wartość na "world!"
. Zwracając wynik funkcji set
, masz gwarancję, że będzie ona działać do momentu zakończenia asynchronicznego zapisywania ciągu znaków do bazy danych:
// 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!');
});
});
Przykłady w kontekście
Większość naszych Cloud Functions próbek kodu zawiera przykłady prawidłowego zakończenia działania funkcji. Oto kilka przykładów typowych przypadków:
- Baza danych czasu rzeczywistego trigger: funkcja HTTP, po której następuje przekierowanie
- Cloud Storage
trigger:
Pobieranie z Cloud Storage, a następnie
then
- Webhook w BDB w trybie zapisu: błąd w klauzuli
then
- Okresowe usuwanie nieużywanych kont: A rejected promise