Transakcja Firebase odczytuje wartość null na ścieżce, nawet jeśli na tej ścieżce znajdują się dane

Dec 22 2020

Rozumiem, że transakcje Firebase czasami odczytują dane jako zerowe, ale potem pętla działa ponownie, aż wartość zostanie pobrana z serwera i zatwierdzona. Jednak mam do czynienia z wyjątkową sytuacją, w której transakcja odczytuje dane o wartości null i zatwierdza wartość, którą zwracam w przypadku wartości null. Proszę spojrzeć na załączony kod.

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

W powyższym kodzie „deductTransaction” jest ścieżką do danych (numer), które chcę zaktualizować

Powyższy kod działa dobrze w niektórych przypadkach np. Pętla uruchamia się ponownie w przypadku odczytania wartości null, a czasami po prostu uruchamia się raz, odczytuje wartość jako null, nawet jeśli na tej ścieżce były jakieś dane, a następnie zatwierdza 25, niszcząc w ten sposób oryginalne dane

PS: Jestem blisko wyrywania włosów, więc każda pomoc byłaby bardzo mile widziana

Odpowiedzi

1 FrankvanPuffelen Dec 22 2020 at 20:48

Kiedy uruchamiasz transakcję w danej lokalizacji, wywołanie zwrotne / obsługi jest natychmiast wywoływane z aktualną przypuszczalną wartością klienta w tej lokalizacji. Najczęściej to początkowe przypuszczenie bieżącej wartości będzie null.

Twój przewodnik musi poradzić sobie z tą sytuacją. Więc: powiedz, że w lokalizacji nie ma żadnych danych i chcesz odliczyć koszt, co by się stało? Zwykle albo wracasz, -25albo każesz przerwać transakcję.

Tak czy inaczej: początkowa wartość domyślna i nowa wartość zostaną przesłane do serwera bazy danych, który następnie wykryje, że początkowa wartość była błędna i zwróci bieżącą wartość do dzwoniącego. Następnie SDK ponownie wywołuje procedurę obsługi / wywołania zwrotnego, z (nie mam nadziei poprawnej) najlepszej odpowiedzi na bieżącą wartość.

Zobacz także:

  • Moduł obsługi transakcji bazy danych Firebase w czasie rzeczywistym jest wywoływany dwukrotnie przez większość czasu (z diagramem powyższego przepływu)
  • Firebase runTransaction nie działa - MutableData ma wartość null
  • Zrozumienie rozwiązywania konfliktów w Firebase
  • Dlaczego wartość currentData w mojej transakcji Firebase jest zawsze zerowa?

Uwaga: obecnie można wykonywać operacje zwiększania i zmniejszania wartości bez transakcji za pomocą incrementoperatora. To znacznie uprości kod i będzie działało lepiej, jak pokazano w artykule Jak szybko można atomowo zwiększyć wartość w bazie danych czasu rzeczywistego Firebase? .

Dla porównania: incrementoperator przyjmuje aktualną wartość, 0jeśli w danej lokalizacji nie ma żadnej wartości.