2016-11-23 25 views
2

我有一個大型數據集(約100k條目),這是訂閱使用'child_added'事件。使用節點7和firebase 3.6.1,這樣做似乎在發起單個child_added事件之前下載整個100k條目。Child_added訂閱似乎下載整個數據集

內存消耗在幾十秒內顯着增長,然後所有child_added事件都會相繼發生。

這是慢:

require('firebase'). 
initializeApp({databaseURL: 'https://someproject.firebaseio.com'}). 
database().ref('data'). 
on('child_added', (snap) => console.log(snap.key)); 

限制依然很快(幾秒鐘的延時):

require('firebase'). 
initializeApp({databaseURL: 'https://someproject.firebaseio.com'}). 
database().ref('data').limitToFirst(10). 
on('child_added', (snap) => console.log(snap.key)); 

鑑於火力地堡的流性質,我認爲它沒有打算行爲child_added訂閱在完成任何事情之前將整個數據集下載到客戶端。

我做錯了什麼,或者這是一個錯誤?

回答

1

雖然,在child_added從firebase documentation提取部分,它說:

child_added從數據庫中檢索項的列表時事件通常使用。與返回位置的全部內容的值不同,爲每個現有子項觸發一次child_added,然後每次將新子項添加到指定路徑時再觸發一次。事件回調會傳遞一個包含新孩子數據的快照。爲了排序目的,它還傳遞了包含前一個子項的第二個參數。

在該網頁At the first lines,我們可以發現這一點:

存儲在火力地堡實時數據庫中的數據由異步聽者附連到參考數據庫中檢索。 對於數據的初始狀態,監聽器將被觸發一次,並且每次數據改變時都會再次觸發監聽器。

似乎是它的正常行爲。它首先檢索所有數據。

+0

這並不能解釋爲什麼在觸發任何child_added事件之前先下載整個數據集。預期的行爲是在下載條目時或者至少以較小的批次查看這些事件。 我修改了代碼示例,謝謝你讓我知道。 – tjclement

+0

好吧,我更新我的答案... – Anfuca

+2

這與Firebase構建要做的事情(流式傳輸數據)有關,因此我很難接受這是真正意圖的行爲。 – tjclement

0

我處於同樣的情況,等待將近40秒,讓第一個孩子開槍。我能想出的唯一解決方案是使用Firebase rest API和淺查詢參數獲取密鑰,然後遍歷每個密鑰並調用Firebase。這基本上是我所做的。

` 
    console.log('start', Date.now()); 
    fetch('https://[firebase_app].firebaseio.com/[your_path].json?shallow=true') 
    .then((response) => { 
     return response.json(); 
    }).then(function(j) { 
     Object.keys(j).forEach(function (key) { 
       console.log(key, 'start', Date.now()); 
       firebase_reference.child(key).on("child_added", function (snapshot) { 
        console.log(key, Date.now()); 
        //now you have the first response without waiting for everything. 
       }); 
     }); 
    });` 

我知道這並不回答你關於child_added功能的問題,但它確實會對child_added發生什麼。我將向Firebase提交功能請求並鏈接此SO問題。