Transaksi Firebase membaca null di jalur meskipun ada data di jalur itu
Saya memahami bahwa transaksi firebase terkadang membaca data sebagai null tetapi kemudian loop berjalan lagi hingga nilai diperoleh dari server dan dilakukan. Namun saya menghadapi situasi unik di mana transaksi membaca data nol dan melakukan nilai yang saya kembalikan jika nol. Silakan lihat kode terlampir.
deductTransaction.transaction((current_value) => {
if (current_value != null) {
return current_value - cost;
}
return 25;
});
Dalam kode di atas "deductTransaction" adalah jalur data (angka) yang ingin saya perbarui
Kode di atas berjalan dengan baik dalam beberapa kasus yaitu loop berjalan lagi jika null dibaca dan kadang-kadang hanya berjalan sekali, membaca nilai sebagai null meskipun ada beberapa data di jalur itu dan kemudian melakukan 25 sehingga menghancurkan data asli
PS: Saya hampir mencabut rambut saya sehingga bantuan apa pun akan sangat dihargai
Jawaban
Saat Anda menjalankan transaksi di lokasi, callback / handler segera dipanggil dengan perkiraan klien saat ini tentang nilai di lokasi itu. Paling sering tebakan awal dari nilai saat ini adalah null
.
Pawang Anda perlu menangani situasi ini. Jadi: katakanlah tidak ada data di lokasi dan Anda ingin mengurangi biayanya, apa yang akan terjadi? Biasanya Anda akan mengembalikan -25
atau meminta transaksi untuk dibatalkan.
Cara lain: tebakan awal dan nilai baru akan dikirim ke server database, yang kemudian mendeteksi bahwa tebakan awal salah, dan mengembalikan nilai saat ini ke pemanggil. SDK kemudian memanggil handler / callback Anda lagi, dengan tebakan terbaik (semoga tidak benar) pada nilai saat ini.
Lihat juga:
- Penangan transaksi database realtime Firebase sering dipanggil dua kali (dengan diagram aliran di atas)
- Firebase runTransaction tidak berfungsi - MutableData bernilai null
- Memahami resolusi konflik di firebase
- Mengapa currentData di transaksi Firebase saya selalu nihil?
Catatan: saat ini Anda dapat melakukan operasi kenaikan dan penurunan tanpa transaksi dengan menggunakan increment
operator. Ini akan mempermudah kode Anda secara signifikan, dan berperforma lebih baik seperti yang ditunjukkan di Seberapa cepat Anda dapat meningkatkan nilai secara atomis di Firebase Realtime Database? .
Sebagai perbandingan: increment
operator mengasumsikan nilai saat ini 0
jika tidak ada nilai di lokasi.