Synchronizacja, async i obietnice

Ważne jest, aby zarządzać cyklem życia funkcji, aby zapewnić jej prawidłowe rozwiązanie. 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 również upewnić się, że instancja Cloud Functions, na której działa Twoja funkcja, nie zostanie zamknięta, zanim funkcja pomyślnie osiągnie stan lub stan zakończenia.

Użyj tych zalecanych podejść do zarządzania cyklem życia swoich funkcji:

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

Uprość kod asynchroniczny dzięki obietnicom JavaScript

Obietnice to nowoczesna alternatywa 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. Możesz przeczytać o obietnicach w pakiecie Firebase SDK na blogu Firebase i ogólnie o obietnicach na MDN .

Jak obietnice działają z funkcjami

Kiedy zwracasz obietnicę JavaScript do funkcji, ta funkcja działa, dopóki obietnica nie zostanie rozwiązana lub odrzucona. Aby wskazać, że funkcja pomyślnie zakończyła swoją pracę, obietnica powinna zostać rozwiązana. 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 odnośnik bazy danych czasu rzeczywistego ref i ustawia jego wartość na "world!" . Zwracając wynik set , Twoja funkcja ma gwarancję, że będzie działała, dopóki asynchroniczna praca polegająca na zapisywaniu ciągu do bazy danych nie zostanie w pełni zakończona:

// 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, które pokazują typowe przypadki: