La transaction Firebase lit null sur le chemin même s'il y a des données sur ce chemin
Je comprends que les transactions Firebase lisent parfois les données comme nulles, mais la boucle s'exécute à nouveau jusqu'à ce que la valeur soit obtenue du serveur et validée. Cependant, je suis confronté à une situation unique où la transaction lit des données nulles et valide la valeur que je retourne en cas de null. Veuillez consulter le code ci-joint.
deductTransaction.transaction((current_value) => {
if (current_value != null) {
return current_value - cost;
}
return 25;
});
Dans le code ci-dessus "deductTransaction" se trouve le chemin des données (nombre) que je souhaite mettre à jour
Le code ci-dessus fonctionne bien dans certains cas, c'est-à-dire que la boucle s'exécute à nouveau au cas où null est lu et parfois il ne s'exécute qu'une seule fois, lit la valeur comme null même s'il y avait des données sur ce chemin, puis commet 25 détruisant ainsi les données d'origine
PS: Je suis sur le point de m'arracher les cheveux, donc toute aide serait très appréciée
Réponses
Lorsque vous exécutez une transaction à un emplacement, le rappel / gestionnaire est immédiatement appelé avec l'estimation actuelle par le client de la valeur à cet emplacement. Le plus souvent, cette estimation initiale de la valeur actuelle sera null
.
Votre gestionnaire doit gérer cette situation. Donc: disons qu'aucune donnée n'existe à l'emplacement et que vous souhaitez déduire le coût, que se passerait-il? En règle générale, vous revenez -25
ou vous dites à la transaction d'abandonner.
Dans les deux cas: l'estimation initiale et la nouvelle valeur seront envoyées au serveur de base de données, qui détecte alors que la supposition initiale était erronée, et renverra la valeur actuelle à l'appelant. Le SDK appelle ensuite à nouveau votre gestionnaire / rappel, avec la meilleure estimation (non, espérons-le, correcte) de la valeur actuelle.
Regarde aussi:
- Le gestionnaire de transactions de base de données en temps réel Firebase est appelé deux fois la plupart du temps (avec un diagramme du flux ci-dessus)
- Firebase runTransaction ne fonctionne pas - MutableData est nul
- Comprendre la résolution des conflits dans Firebase
- Pourquoi les données actuelles de ma transaction Firebase sont-elles toujours nulles?
Remarque: vous pouvez désormais effectuer des opérations d'incrémentation et de décrémentation sans transaction en utilisant l' increment
opérateur. Cela simplifiera considérablement votre code et fonctionnera mieux, comme indiqué dans À quelle vitesse pouvez-vous incrémenter de manière atomique une valeur sur la base de données Firebase Realtime? .
À titre de comparaison: l' increment
opérateur suppose une valeur actuelle de 0
si aucune valeur n'existe à l'emplacement.