Sincronización, asíncronismo y promesas

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() o res.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: