Es importante gestionar el ciclo de vida de una función para garantizar que se resuelva correctamente. Al finalizar las funciones correctamente, puede evitar cargos excesivos debido a funciones que se ejecutan durante demasiado tiempo o que se repiten infinitamente. Además, puede asegurarse de que la instancia de Cloud Functions que ejecuta su función no se cierre antes de que ésta alcance con éxito su condición o estado de finalización.
Utilice estos enfoques recomendados para gestionar el ciclo de vida de sus funciones:
- Resuelva funciones que realizan procesamiento asincrónico (también conocidas como "funciones en segundo plano") devolviendo una promesa de JavaScript .
- Termine las funciones HTTP con
res.redirect()
,res.send()
ores.end()
. - Terminar una función síncrona con un
return;
declaración.
Simplifique el código asincrónico con promesas de JavaScript
Las promesas son una alternativa moderna a las devoluciones de llamada para código asincrónico. Una promesa representa una operación y el valor futuro que puede devolver. También le permite propagar errores similares a try/catch en código sincrónico. Puede leer sobre las promesas en el SDK de Firebase en The Firebase Blog y las promesas en general en MDN .
Cómo funcionan las promesas con funciones
Cuando devuelve una promesa de JavaScript a una función, esa función continúa ejecutándose hasta que la promesa se resuelve o rechaza. Para indicar que una función ha completado su trabajo con éxito, se debe resolver la promesa. Para indicar un error, la promesa debe rechazarse. Esto significa que sólo necesita manejar los errores que desee.
El siguiente código toma una ref
de Firebase Realtime Database y establece su valor en "world!"
. Al devolver el resultado de set
, se garantiza que su función seguirá ejecutándose hasta que se complete por completo el trabajo asincrónico de escribir la cadena en la base de datos:
// 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!');
});
});
Ejemplos en contexto
La mayoría de nuestros ejemplos de código de Cloud Functions incluyen ejemplos de terminación adecuada de funciones. A continuación se muestran algunos que demuestran casos típicos:
- Activador de base de datos en tiempo real : una función HTTP seguida de una redirección
- Activador de Cloud Storage : una descarga de almacenamiento seguida de
then
- Webhook en la escritura de la base de datos en tiempo real : se produce un error dentro de una cláusula
then
- Eliminar periódicamente cuentas no utilizadas : una promesa rechazada