É 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 a função não seja desligada antes que a função alcance a condição ou o 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()
oures.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
de Firebase Realtime Database e define o respectivo valor como
"world!"
. Ao retornar o resultado de set
, a 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 exemplos de código do Cloud Functions inclui exemplos de encerramento correto da função. Veja abaixo alguns exemplos que demonstram casos comuns:
- Acionador do Realtime Database: uma função HTTP seguida de um redirecionamento.
- Acionador do Cloud Storage: um download de armazenamento seguido por
then
- Webhook na gravação do Realtime Database: um erro gerado dentro de uma cláusula
then
- Eliminar periodicamente contas não utilizadas: uma promessa recusada.