2016-11-23 5 views
2

У меня есть большой набор данных (~ 100 тыс. Записей), который подписывается на использование события child_added. Используя узел 7 и firebase 3.6.1, выполнение этого, похоже, загружает целые записи за 100 КБ до того, как будет запущено одно событие child_added.Подкачка 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)); 

Учитывая потоковый характер Firebase, я полагаю, он не предназначен поведение для child_added подписок загрузите весь набор данных клиенту до того, как все будет сделано.

Я делаю что-то неправильно или это ошибка?

ответ

1

Хотя что в child_added раздела извлеченного из firebase documentation он говорит:

child_added события, как правило, используется при получении списка элементов из базы данных. В отличие от значения, которое возвращает все содержимое местоположения, child_added запускается один раз для каждого существующего дочернего элемента, а затем снова каждый раз, когда новый ребенок добавляется к указанному пути. Обратный вызов события получает моментальный снимок, содержащий данные нового ребенка. Для целей заказа также передается второй аргумент, содержащий ключ предыдущего дочернего элемента.

At the first lines на той же странице, мы можем нашел это:

Данные, хранящиеся в базе данных в реальном времени Firebase извлекается путем присоединения асинхронного слушателю ссылки базы данных. Слушатель будет запускаться один раз для исходного состояния данных и снова в любое время, когда данные будут изменены.

Кажется, это нормальное поведение. Сначала он извлекает все данные.

+0

Это не объясняет, почему весь набор данных загружается первым, прежде чем запускается какое-либо из событий child_added. Ожидаемым поведением было бы видеть, что эти события срабатывают при загрузке записей или, по крайней мере, в меньших партиях. Я изменил примеры кода, спасибо, что дал мне знать. – tjclement

+0

Хорошо, я обновляю свой ответ ... – Anfuca

+2

Это противоречит тому, что Firebase была создана для создания (потоковой передачи данных), поэтому я с трудом принимаю, что это действительно предназначенное поведение. – tjclement

0

Я в той же ситуации, ожидая почти 40 секунд, чтобы первый ребенок стрелял. Единственное решение, которое я мог придумать, заключалось в том, чтобы получить ключи, используя API 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.

Смежные вопросы