2016-03-28 15 views
1

Firebase kullanıyorum ve bazı eylemleri zincirlemek istiyorum. İşte senaryo: Diziye bir öğe eklemek istiyorum ve push Id özelliğini kullanmak istemediğim için, bir öğe eklendiğinde her adımda bir 'Last_Id' değişkeni güncellemek istiyorum. Ayrıca kayıt sayısını saymak için bir 'Counter' değişkeni de güncelliyorum (bu yüzden yavaş olabilir numChildren() kullanarak bitmiyor). sayısı ve last_id değişken böyle aynı ağaçta şunlardır: Sayısı:
----------> last_id Bunu yapan

----------> SayaçBirden çok firebase eylemi ve geri dönüşler zincirleme

  1. 1- last_id

  2. retreived edilir: her ikisi de tek bir işlemde aynı anda güncellenebilir böylece bir öğe eklediğinizde

    Yani sırayla gerçekleşmesi 3 şeyler istiyorum

    Ite m

  3. last_id eklenir ve Sayaç hem güncellenen

Bu sözlerin kullanır benim kodudur.

add:function(ref,obj){ 

    //get last_id 
    return baseRef.child('Count').child("Last_Id").once("value") 
      .then(function(snapshot){ 
       return (snapshot.val()+1); 
      }) 
    //add new data 
      .then(function(key){ 
       return baseRef.child(ref).child(key).set(obj,function(error){ 
        if (error) 
         console.log(error.code) 
        })  
      }) 
    //update Count and last key 
      .then(this.updateCountAndKey(ref,1)) 


}, 


updateCountAndKey:function(ref,i){ 
    return baseRef.child('Count').transaction(function(currentValue) { 
     if (currentValue!==null) 
      return { 
       Counter:(currentValue.Counter||0) +i, 
       Last_Id:(currentValue.Last_Id||0)+1 
       } 
    },function(err,commited,snap) { 
     if(commited) 
      console.log("updated counter to "+ snap.val()); 
     else { 
      console.log("oh no"+err); 
     } 
    },false) 

} 

javascript yeniyim ve özellikle sözler bu şeyleri yapmanın sağlam bir yol olup olmadığını bilmek istiyorum çünkü. Ayrıca bir şeyler ters giderse roll-back yapmak nasıl bilmek istiyorum. Böylece bir şey başarısız olursa, diğer her şey başarısız olur (örneğin, Last_id ve Counter'daki güncelleme başarısız olursa öğe eklenmez). Herhangi bir yardım çok takdir edilmektedir.

cevap

3

Firebase documentation belirtildiği gibi, işlemler yalnızca Atomically modify the data at this location olabilir, dolayısıyla Firebase'deki diğer düğümleri güncellemek için işlemleri kullanamazsınız.

İtme kimliğinin (Firebase tarafından oluşturulan) güvenli bir şekilde kullanılması önerilir. Bu işleminizin bu kısmı için bir işlem kullanma ihtiyacını ortadan kaldıracaktır. Sayımı sürdürmeniz gerekiyorsa hala bir işlem kullanmanız gerekecektir. Bu # 2'nin başarısı üzerine yapılmalıdır (bir öğe ekleyerek).

Şimdi süreç aşağıdaki gibi görünecektir:

  1. itme bir öğe (otomatik kimliği oluşturulan) başarısı üzerine
  2. , alınma sayısı Yorumlarınız için
+0

Teşekkür artırmak için bir işlem kullanırlar. Bunun farkındayım, bu yüzden last_id ve Counter'yi aynı yere koydum. İkisinin de aynı anda güncellenmesini istedim. Geri bildirimler hakkında bunun için herhangi bir tavsiyeniz var mı? – user3552551

İlgili konular