Synchronisation, asynchrone et promesses

Il est important de gérer le cycle de vie d'une fonction pour s'assurer qu'elle se résout correctement. En terminant correctement les fonctions, vous pouvez éviter les frais excessifs liés aux fonctions qui s'exécutent trop longtemps ou en boucle infinie. Vous pouvez également vous assurer que l'instance Cloud Functions qui exécute votre fonction ne s'arrête pas avant que votre fonction n'atteigne son état ou sa condition d'arrêt.

Suivez ces approches recommandées pour gérer le cycle de vie de vos fonctions :

  • Résoudre les fonctions qui effectuent un traitement asynchrone (également appelé "fonctions d'arrière-plan") en renvoyant une promesse JavaScript
  • Arrêtez les fonctions HTTP avec res.redirect(), res.send() ou res.end().
  • Mettre fin à une fonction synchrone avec une instruction return;.

Simplifier le code asynchrone avec des promesses JavaScript

Les promesses sont une alternative moderne aux rappels pour le code asynchrone. Une promesse représente une opération et la valeur future qu'elle peut renvoyer. Il vous permet également de propager des erreurs similaires à try/catch dans le code synchrone. Pour en savoir plus sur les promesses dans le SDK Firebase, consultez le blog Firebase, et pour en savoir plus sur les promesses en général, consultez MDN.

Fonctionnement des promesses avec les fonctions

Lorsque vous renvoyez une promesse JavaScript à une fonction, cette fonction continue de s'exécuter jusqu'à ce que la promesse soit résolue ou refusée. Pour indiquer qu'une fonction a terminé son travail avec succès, la promesse doit être résolue. Pour indiquer une erreur, la promesse doit être rejetée. Cela signifie que vous ne devez gérer que les erreurs que vous souhaitez.

Le code suivant prend un ref Firebase Realtime Database et définit sa valeur sur "world!". En renvoyant le résultat de set, votre fonction continuera de s'exécuter jusqu'à ce que le travail asynchrone d'écriture de la chaîne dans la base de données soit entièrement terminé :

// 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!');
  });
});

Exemples en contexte

La plupart de nos exemples de code Cloud Functions incluent des exemples de terminaison de fonction appropriée. Voici quelques exemples de cas typiques: