Synchronizacja, asynchroniczne i obietnice

Ważne jest, aby zarządzać cyklem życia funkcji, aby zapewnić jej prawidłowe działanie. Prawidłowe kończenie funkcji pozwala uniknąć nadmiernych opłat za funkcje, które działają zbyt długo lub zapętlają się w nieskończoność. Możesz też upewnić się, że instancja Cloud Functions, w której działa funkcja, nie zostanie wyłączona, zanim funkcja osiągnie warunek lub stan zakończenia.

Aby zarządzać cyklem życia funkcji, użyj tych zalecanych metod:

  • Funkcje, które wykonują przetwarzanie asynchroniczne (nazywane też „funkcjami działającymi w tle”), rozwiązuj, zwracając obietnicę JavaScriptu.
  • Zakończ funkcje HTTP za pomocą res.redirect(), res.send() lub res.end().
  • Zakończ funkcję synchroniczną instrukcją return;.

Uproszczenie kodu asynchronicznego za pomocą obietnic JavaScriptu

Obiekty Promise są nowoczesną alternatywą dla wywołań zwrotnych w przypadku kodu asynchronicznego. Obiekt Promise reprezentuje operację i wartość, którą może ona zwrócić w przyszłości. Umożliwia też propagowanie błędów podobnych do try/catch w kodzie synchronicznym. Więcej informacji o obietnicach w pakiecie SDK Firebase znajdziesz na blogu Firebase, a ogólne informacje o obietnicach – na stronie MDN.

Jak obiekty Promise działają z funkcjami

Gdy zwracasz obietnicę JavaScriptu do funkcji, funkcja ta działa, dopóki obietnica nie zostanie spełniona lub odrzucona. Aby wskazać, że funkcja zakończyła działanie, obietnica powinna zostać rozwiązana. Aby wskazać błąd, obietnica powinna zostać odrzucona. Oznacza to, że musisz obsługiwać tylko te błędy, które chcesz.

Poniższy kod pobiera Firebase Realtime Database ref i ustawia jego wartość na "world!". Zwrócenie wyniku set gwarantuje, że funkcja będzie działać, dopóki asynchroniczne zapisywanie ciągu znaków w bazie danych nie zostanie całkowicie zakończone:

// 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 przykładowych kodów zawiera przykłady prawidłowego zakończenia funkcji. Oto kilka przykładów typowych przypadków: