Il est important de gérer le cycle de vie d'une fonction pour s'assurer qu'elle se résout correctement. En arrêtant correctement les fonctions, vous pouvez éviter des frais excessifs liés à des fonctions qui s'exécutent trop longtemps ou qui bouclent à l'infini. Vous pouvez également vous assurer que l'instance Cloud Functions exécutant votre fonction ne s'arrête pas avant que votre fonction n'atteigne sa condition ou son état de fin avec succès.
Utilisez ces approches recommandées pour gérer le cycle de vie de vos fonctions :
- Résolvez les fonctions qui effectuent un traitement asynchrone (également appelées "fonctions d'arrière-plan") en renvoyant une promesse JavaScript.
- Arrêtez les fonctions HTTP avec
res.redirect()
,res.send()
oures.end()
. - Mettez fin à une fonction synchrone avec une instruction
return;
.
Simplifier le code asynchrone avec les 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 les erreurs de la même manière que try/catch dans le code synchrone. Pour en savoir plus sur les promesses dans le SDK Firebase, consultez le blog Firebase. 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 refusée. Cela signifie que vous n'avez besoin de gérer que les erreurs que vous souhaitez.
Le code suivant prend un Firebase Realtime Database ref
et définit sa valeur sur "world!"
. En renvoyant le résultat de set
, votre fonction est assurée de continuer à s'exécuter jusqu'à ce que l'écriture asynchrone de la chaîne dans la base de données soit entièrement terminée :
// 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 d'arrêt correct des fonctions. Voici quelques exemples de cas typiques :
- Déclencheur Realtime Database : fonction HTTP suivie d'une redirection
- Déclencheur Cloud Storage : téléchargement de stockage suivi de
then
- Webhook sur l'écriture Realtime Database : une erreur générée dans une clause
then
- Supprimer régulièrement les comptes inutilisés : Promesse refusée