Firebase işlemi, bu yolda veri olsa bile yolda null okur

Dec 22 2020

Firebase işlemlerinin bazen verileri boş olarak okuduğunu ancak daha sonra değer sunucudan alınıp kaydedilene kadar döngünün tekrar çalıştığını anlıyorum. Ancak, işlemin boş verileri okuduğu ve boş olması durumunda döndürdüğüm değeri teslim ettiği benzersiz bir durumla karşı karşıyayım. Lütfen ekli koda bir göz atın.

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

"DeductTransaction" yukarıdaki kodda, güncellemek istediğim verilerin (sayı) yolu

Yukarıdaki kod bazı durumlarda sorunsuz çalışır, yani döngü null okunduğunda tekrar çalışır ve bazen sadece bir kez çalışır, bu yolda bazı veriler olsa bile değeri boş olarak okur ve sonra 25'i işleyerek orijinal verileri yok eder.

Not: Saçımı çekmeye çok yakınım, bu yüzden herhangi bir yardım çok takdir edilecektir.

Yanıtlar

1 FrankvanPuffelen Dec 22 2020 at 20:48

Bir konumda bir işlem çalıştırdığınızda, geri arama / işleyici, istemcinin o konumdaki değerle ilgili geçerli tahminiyle hemen çağrılır. Çoğu zaman, mevcut değerin bu ilk tahmini olacaktır null.

Yöneticinizin bu durumu halletmesi gerekiyor. Öyleyse: konumda hiçbir veri olmadığını ve maliyeti düşürmek istediğinizi söyleyin, ne olur? Genellikle ya geri dönersiniz -25ya da işlemi iptal etmesini söylersiniz.

Her iki durumda da: ilk tahmin ve yeni değer veritabanı sunucusuna gönderilir, bu sunucu daha sonra ilk tahminin yanlış olduğunu tespit eder ve mevcut değeri arayana döndürür. SDK daha sonra işleyicinizi / geri aramayı, geçerli değerde (hayır, umarım doğrudur) en iyi tahminle yeniden çağırır.

Ayrıca bkz:

  • Firebase gerçek zamanlı veritabanı işlem işleyicisi çoğu zaman iki kez çağrılır (yukarıdaki akışın bir diyagramıyla)
  • Firebase runTransaction çalışmıyor - MutableData boş
  • Firebase'de çakışma çözümünü anlama
  • Firebase işlemimdeki currentData neden her zaman sıfır?

Not: Günümüzde incrementoperatörü kullanarak işlem yapmadan artırma ve eksiltme işlemleri gerçekleştirebilirsiniz . Bu, kodunuzu önemli ölçüde basitleştirir ve Firebase Gerçek Zamanlı Veritabanında bir değeri atomik olarak ne kadar hızlı artırabilirsiniz? Bölümünde gösterildiği gibi daha iyi performans gösterir. .

Karşılaştırma için: incrementoperatör 0, konumda herhangi bir değer yoksa geçerli bir değer varsayar .