Synchronizacja, async i obietnice

Ważne jest, aby zarządzać cyklem życia funkcji, aby mieć pewność, że zostanie ona poprawnie rozwiązana. Prawidłowe kończenie funkcji pozwala uniknąć nadmiernych opłat spowodowanych funkcjami, które działają zbyt długo lub działają w nieskończonej pętli. Możesz także upewnić się, że instancja Cloud Functions, w której działa Twoja funkcja, nie zostanie zamknięta, zanim funkcja pomyślnie osiągnie warunek lub stan zakończenia.

Skorzystaj z tych zalecanych podejść, aby zarządzać cyklem życia swoich funkcji:

  • Rozwiąż funkcje, które wykonują przetwarzanie asynchroniczne (znane również jako „funkcje w tle”), zwracając obietnicę JavaScript .
  • Zakończ funkcje HTTP za pomocą res.redirect() , res.send() lub res.end() .
  • Zakończ funkcję synchroniczną return; oświadczenie.

Uprość kod asynchroniczny dzięki obietnicom JavaScript

Obietnice są nowoczesną alternatywą dla wywołań zwrotnych dla kodu asynchronicznego. Obietnica reprezentuje operację i przyszłą wartość, jaką może zwrócić. Pozwala także propagować błędy podobne do try/catch w kodzie synchronicznym. O obietnicach pakietu Firebase SDK możesz przeczytać na blogu Firebase i ogólnie o obietnicach na MDN .

Jak obietnice współpracują z funkcjami

Kiedy zwrócisz obietnicę JavaScript do funkcji, funkcja ta będzie działać do momentu rozwiązania lub odrzucenia obietnicy. Aby wskazać, że funkcja pomyślnie zakończyła swoją pracę, należy rozpatrzyć obietnicę. Aby wskazać błąd, obietnicę należy odrzucić. Oznacza to, że musisz obsługiwać tylko te błędy, które chcesz.

Poniższy kod pobiera ref danych Firebase Realtime Database i ustawia jej wartość na "world!" . Zwracając wynik set , masz pewność, że funkcja będzie działać do momentu całkowitego zakończenia asynchronicznego zapisu 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 przykładów kodu Cloud Functions zawiera przykłady prawidłowego zakończenia funkcji. Oto kilka przykładów typowych przypadków: