Dans Firebase Cloud Functions, est-il possible de mettre à jour en toute sécurité un document de manière asynchrone sans attendre son retour ?
P粉043432210
2023-08-17 14:53:58
<p>Dans mon fichier de fonction Firebase Cloud, j'ai la fonction locale suivante qui effectue une opération d'obtention et de mise à jour de document avant de renvoyer certaines propriétés. </p>
<pre class="brush:php;toolbar:false;">fonction async getRandomDocLessThanOperator(seed) {
essayer {
const db = admin.firestore();
const snapshot = wait db.collection("users").where("random", "<=", seed)
.limite(1)
.obtenir();
si (instantané.vide) {
return null; // L'appelant essaie ensuite l'opérateur supérieur à
}
const doc = instantané.docs[0];
doc.ref.update({"random": seed}); // Mise à jour avec une nouvelle graine
return doc.get("uid");
} attraper (erreur) {
lancer une nouvelle erreur (erreur);
}
}</pré>
<p>Cette fonction fonctionne bien, mais je crains d'essayer de mettre à jour le document de manière asynchrone avant de revenir. Cependant, lors des tests, la documentation n'a jamais manqué d'être mise à jour. Cependant, est-il possible que cette fonction expire avant la fin de la mise à jour ? </p>
<p> Quoi qu'il en soit, pour résoudre le problème, j'ai essayé d'utiliser <code>await</code>
<pre class="brush:php;toolbar:false;">const doc = snapshot.docs[0];
wait doc.ref.update({"random": seed});
return doc.get("uid");</pre>
<p>Cependant, lorsque je fais cela, la fonction renvoie la chaîne attendue mais ne met pas à jour le document. </p>
<ol>
<li>Pourquoi l'ajout de <code>await</code> avant l'opération de mise à jour empêche-t-il la mise à jour ? ≪/li>
<li>Est-il prudent de ne pas attendre les mises à jour et de le faire de manière asynchrone comme dans le premier exemple ? ≪/li>
</ol><p><br /></p>
Je ne sais pas pourquoi votre mise à jour n'a pas fonctionné (vous pourriez peut-être utiliser davantage de journalisation pour avoir une image plus claire de ce qui se passe au moment de l'exécution). Mais ce que je peux dire avec certitude, c'est que lorsque vous utilisez Cloud Functions, vous devez renvoyer une promesse qui se résout une fois que tout le travail asynchrone est terminé (ou attendre chaque promesse rencontrée par ), sinon la fonction risque d'être fermée avant le travail. est terminé. C’est une erreur courante que commettent les développeurs.
Non, ce n'est pas "sûr" car vous n'avez aucune garantie que le code asynchrone continuera à s'exécuter après la fin de la fonction. Vous devez renvoyer une promesse qui n'est résolue qu'une fois tous les travaux asynchrones terminés.
Veuillez lire la documentation à ce sujet.