Síncrono, asíncrono y promesas

Es importante administrar el ciclo de vida de una función para garantizar que se resuelva de manera apropiada. Cuando finalizas las funciones de forma correcta, puedes evitar cargos excesivos debido a funciones que se ejecutan durante mucho tiempo o entran en un bucle infinito. Además, puedes asegurarte de que la instancia de Cloud Functions que ejecuta la función no se cierre antes de que la función alcance su condición o estado de finalización de manera correcta.

Usa los siguientes enfoques recomendados para administrar el ciclo de vida de tus funciones:

  • Resuelve funciones que realizan procesamientos asíncronos (también conocidas como “funciones en segundo plano”) mediante la generación de una promesa de JavaScript.
  • Finaliza las funciones de HTTP con res.redirect(), res.send() o res.end().
  • Finaliza una función síncrona con una declaración return;.

Simplifica el código asíncrono con promesas de JavaScript

Las promesas son una alternativa moderna a las devoluciones de llamada para el código asíncrono. Una promesa representa una operación y el valor futuro que podría mostrar. También te permite propagar errores de manera similar a un bloque try/catch en el código síncrono. Puedes leer sobre las promesas en el SDK de Firebase en el blog de Firebase y las promesas en general en MDN.

Cómo funcionan las promesas con las funciones

Cuando muestras una promesa de JavaScript a una función, esta sigue ejecutándose hasta que la promesa se resuelve o rechaza. Para indicar que una función concluyó de manera correcta, la promesa debe resolverse. Para indicar un error, la promesa debe rechazarse. Esto significa que solo debes solucionar los errores que desees.

El siguiente código toma una ref de Firebase Realtime Database y le asigna el valor "world!". La función muestra el resultado de set, lo que garantiza que siga ejecutándose hasta que el trabajo asíncrono de escribir la string en la base de datos finalice por completo:

// 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 cómo finalizar correctamente las funciones. Estos son algunos ejemplos de casos típicos: