Sincronização, assíncrona 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 cobranças excessivas de funções que são executadas por muito tempo ou fazem loop infinito. Além disso, você pode garantir que a instância do Cloud Functions que executa sua função não seja encerrada antes que ela atinja com êxito sua condição ou estado de encerramento.

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

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

Simplifique o código assíncrono com promessas JavaScript

As promessas são uma alternativa moderna aos retornos de chamada para código assíncrono. Uma promessa representa uma operação e o valor futuro que ela pode retornar. Ele também permite propagar erros semelhantes a try/catch em código síncrono. Você pode ler sobre promessas no Firebase SDK no Firebase Blog e promessas em geral no MDN .

Como as promessas funcionam com as funções

Quando você retorna uma promessa 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 concluiu seu trabalho com êxito, a promessa deve ser resolvida. Para indicar um erro, a promessa deve ser rejeitada. Isso significa que você só precisa lidar com os erros que deseja.

O código a seguir pega uma ref do Firebase Realtime Database e define seu valor como "world!" . Ao retornar o resultado de set , é garantido que sua função continuará em execução até que o trabalho assíncrono de gravação da 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 dos nossos exemplos de código do Cloud Functions inclui exemplos de encerramento adequado de funções. Aqui estão alguns que demonstram casos típicos: