2016-03-28 15 views
1

私はfirebaseを使用しており、いくつかのアクションを連鎖したい。ここにシナリオがあります: アイテムを配列に追加したいのですが、プッシュIDを使用したくないので、アイテムが追加されるたびにfirebaseの変数 'Last_Id'が更新されます。レコードの数を数えるために 'Counter'変数も更新しています(numChildren()を使用しても遅くなることはありません)。 数とlast_id変数は、このように同じ木である: 数:
---------->私はこれをしなかった
---------->カウンター
をlast_id複数のfirebaseアクションとロールバックの連鎖

  1. の1- last_idが

  2. をretreivedされています。彼らは両方私が順番に発生する3つの事をしたい項目を追加するときに、単一のトランザクション

    で同時に更新できるように

    Ite mは

  3. last_idを添加し、そしてカウンターは の両方をされている更新

これは約束を使用する私のコードです。

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を初めて使い、特にこれが頑丈な方法であるかどうかを知りたいと約束しています。私は何かがうまくいかないときにロールバックをする方法も知りたい。あるものが失敗すると他のすべてが失敗する(例えば、Last_idとCounterへの更新が失敗し、アイテムが追加されない場合)。 何か助けていただければ幸いです。

答えて

3

Firebase documentationが指定するように、トランザクションはAtomically modify the data at this locationにしかなりません。したがって、Firebaseの他のノードを更新するトランザクションは使用できません。

プッシュIDを使用することをお勧めします(安全な方法でFirebaseによって生成されます)。これにより、プロセスのこの部分でトランザクションを使用する必要がなくなります。カウントを維持する必要がある場合は、引き続きトランザクションを使用する必要があります。これは、#2の成功(項目の追加)で行う必要があります。

今、あなたのプロセスは次のようになります。

  1. プッシュアイテム(自動IDを生成)は、成功した
  2. 、数あなたのコメントを
+0

感謝をインクリメントするトランザクションを使用します。私はこれを認識しています。そのため、last_idとCounterを同じ場所に配置しています。私はそれらの両方を同時に更新したかった。ロールバックはどうしたらいいですか? – user3552551

関連する問題