2017-04-02 63 views
0

這裏是場景:我從firebaseRef_1(使用.once回調)獲得來自Firebase的初始有效內容(例如5個對象)。然後,我將每個收到的對象轉換爲新的Firebase參考。這新產生的裁判看起來是這樣的:收聽爲Firebase生成的動態數組參考的最佳方法?

"data/ccccyyyyotKKiWC2xaV1WZ7H3/things/-KgXo121225H9_Nks1O" 

舉例來說,如果我有對.once通話5點傳入的對象,那麼我將創建5名裁判(請參見下面的代碼片段)。

一旦我創建/產生的REF(多個)欲:

a)創建一個。對聽衆以每5個那些參考文獻的。

b)若(可以說)一段時間新的數據後1「行」到達firebaseRef_1,我要生成一個新的參考,然後創建一個監聽器 - 但現在,只是新增加的項目 。否則,如果我嘗試遍歷所有(現在的6個)元素,Firebase會拋出一個承諾錯誤,告訴我原始5個元素(refs)已經有一個偵聽器。

,我想最初使用.once呼叫的原因,是爲了讓我能「在.once所有」得到整個有效載荷(雙關語意!),這使得填充一個ListView(反應母語)更快。我嘗試使用.child_added的方法,但在初始加載(這5行).child_added被調用5次,所以你可以看到行在我不喜歡的ListView中一個接一個地出現。

我應該如何最好地在代碼中構造這個以實現我上面描述的內容?我是不是應該有一個.once調用是這樣的:

generateTheRefs() { 
    firebase.database() 
    .ref('data/' + firebaseUID + '/initialPath') 
    .once('value', (snapshot) => { 

    snapshot.forEach(childSnapshot => { 
     var childData = childSnapshot.val(); 
     let path = `data/${childData.item1}/things/${childData.item2}`;   

     //now create a .on listener 
     firebase.database() 
     .ref(path) 
     .on('value', (snapshot) => { 
      //.... 
     }); 
    }); 
    }); 
} 

回答

0

,你可以:

  1. 閱讀整個初始設置與一次(),並顯示。將它存儲在某個變量中。
  2. 然後立即向一個監聽器註冊on('child_added'),並且只在您最初存儲過的事物上只作用於之前沒有收集過的內容()。
0

這聽起來像是你在同一時間使用所有的結果,所以他們不運球隨着時間的推移。您可以使用Promise.all()數組來等待它們在使用前全部到達,如下所示:

function generateTheRefs() { 
    firebase.database() 
     .ref('data/' + firebaseUID + '/initialPath') 
     .once('value', (snapshot) => { 

     let promises = []; 

     snapshot.forEach(childSnapshot => { 
      var childData = childSnapshot.val(); 
      let path = `data/${childData.item1}/things/${childData.item2}`; 

      //now create a .on listener 
      promises.push(firebase.database() 
       .ref(path) 
       .once('value')); 
     }); 

     Promise.all(promises).then(snaps => { 
      snaps.forEach(snap => { 
      // ... 
      console.log(snap.val()); 
      })    
     }); 
     }); 
}