Sincronização, dessincronização e promessas

É importante gerenciar o ciclo de vida de uma função para garantir que ela seja resolvida corretamente. Ao encerrar as funções corretamente, você pode evitar cargas excessivas de funções que funcionam por muito tempo ou entram em um loop infinito. Além disso, você garante que a instância do Cloud Functions que executa sua função não seja desligada antes que sua função alcance a condição ou estado encerrado.

Use essas abordagens recomendadas para gerenciar o ciclo de vida das suas funções:

  • Resolva funções que executam um processamento assíncrono, também conhecido como "funções em segundo plano", com o retorno de uma promessa de JavaScript.
  • Encerre funções HTTP com res.redirect(), res.send() ou res.end().
  • Encerre uma função síncrona com uma instrução return;.

Simplificar o código assíncrono com promessas de JavaScript

Promessas são uma alternativa moderna para retornos de chamada com códigos assíncronos. Uma promessa representa uma operação e o valor futuro que ela pode retornar. Ela também permite propagar erros similares a try/catch em códigos síncronos. Leia sobre promessas no SDK do Firebase no Blog do Firebase e promessas em geral no MDN.

Como as promessas funcionam com funções

Quando você retorna uma promessa de JavaScript para uma função, essa função continua em execução até que a promessa seja resolvida ou rejeitada. Para indicar que uma função foi concluída com sucesso, a promessa deve ser resolvida. Para indicar um erro, a promessa deve ser rejeitada. Isso significa que você só precisará lidar com os erros que quiser.

O código a seguir usa um ref do Firebase Realtime Database e define o valor dele como "world!". Ao retornar o resultado de set, sua função continuará em execução até que o trabalho assíncrono de gravar a string no banco de dados seja totalmente concluído:

// 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!');
  });
});

Exemplos em contexto

A maioria das amostras de código do Cloud Functions inclui exemplos do encerramento correto da função. Veja abaixo alguns exemplos que demonstram casos comuns: