2017-02-05 4 views
0

Мне нужно прочитать много данных из firebase (~ 3000 детей и ~ 1,5 МБ), и будет хорошо, если я смогу показать что-то, что загружено пользователем. Поэтому я решил использовать child_added, чтобы показать каждый из них, но он не работает, как я ожидаю.Как работает firebase child_added?

После некоторых экспериментов я обнаружил, что на первого ребенка добавлено ~ 5 секунд, а несколько секунд - до конца (~ 3 секунды). если я использую событие value, потребуется около 5 секунд, чтобы получить их все.

Так что мой вопрос в том, как работает firebase child_added? Он просто загружает их все и запускает событие на каждом из них или мне что-то не хватает?

Update

Это моя структура базы данных.

- contacts 
    - nw7VoNBw0iLUkb 
    - city 
    - company 
    - email 
    - name 
    - gender 
    - BEu8Yd7ihgxbaF 
    ... 

и некоторые из моего кода

console.log('start', Date.now()) 
firebase.database().ref('/contacts').on('child_added', snapshot => { 
    console.log('add', Date.now()) 
}) 

и

console.log('start', Date.now()) 
firebase.database().ref('/contacts').on('value').then(snapshot => { 
    console.log('end', Date.now()) 
}) 
+0

Доступ к каждому узлу требует времени. Загружая ваши данные ребенком по ребенку, это займет значительное количество времени больше, чем загрузка их всех – ThunderStruct

+0

Я согласен, но как насчет первой загрузки? Я думаю, что это должно быть быстрее, чем загрузить все из них, не так ли? –

+0

Ну, это больше о глубине узла. Если ваш первый полученный ребенок более глубоко вложен, тогда потребуется больше времени. Я предлагаю вам добавить структуру базы данных к вашему вопросу. Люди могут помочь вам так :-) – ThunderStruct

ответ

1

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

Если вам нужен один снимок всех данных на конкретном узле, только один раз, и вы не хотите получать уведомления о любых будущих изменений, просто используйте once('value').

Это хорошая идея для use the docs, чтобы ознакомиться с разницей между on() и once() и различными типами событий.

+1

В документах: 'однажды эквивалентен вызову on(), а затем вызывается()', поэтому я думаю, что между ними нет никакой разницы по скорости загрузки, и у меня нет проблемы с этим. Мой вопрос о событии 'child_added' и' value', мне просто интересно, почему первое время загрузки 'child_added' и загрузка всех из них с помощью' value' немного то же самое. Благодарю. –

+0

Вы можете извлекать одни и те же данные из кеша каждый раз. Если у вас нет большого количества данных, и некоторые из них не будут сохранены, я не думаю, что какое-либо наблюдение за производительностью будет очень значимым. Просто запросите минимальный объем данных, когда он вам нужен, и пусть SDK сделает то, что лучше для производительности. –