2016-08-16 2 views
1

У меня есть функция в js, которая должна обновляться после получения данных из Firebase.Скрипт запуска Firebase после извлечения существующих данных

firebase.database().ref('/users/' + this.userId + '/info').on('child_added', function(snapshot){ 
    this.myFunction(); 
}.bind(this)); 

Проблема заключается в том, что данные в Firebase очень большой, так что я не то, что для запуска функции много раз. Вот как мне это нужно:

  1. Извлечь ВСЕ СУЩЕСТВУЮЩИЕ данные от Firebase.
  2. Запустите функцию (один раз).
  3. Каждый раз, когда поступает больше данных из Firebase, снова запустите функцию.

Возможно ли это?

Спасибо.

ответ

1

Ответ Югена - один из способов сделать это. Но это означает, что вы будете обрабатывать всех детей при каждом изменении, что может быть не таким, каким вы хотите.

Альтернативой является обработка исходных детей с использованием события value, а затем последующие изменения с событиями child_. Вы можете использовать гарантию, что событие value будет срабатывать после всех связанных событий child_, чтобы определить, выполнена ли начальная полезная нагрузка.

var isInitialValueDone = false 

ref.once('value', function(snapshot) { 
    snapshot.forEach(function(child) { 
    console.log('Do something with '+child.key); 
    }); 
    isInitialValueDone = true; 
}); 
ref.on('child_added', function(snapshot) { 
    if (isInitialValueDone) { 
    console.log('Do something with '+snapshot.key); 
    } 
}); 
+0

Просто изменил первый 'on' на 'once' , с вашим ответом мне не нужно реструктурировать свой макет данных. –

+0

Ouch ... хорошая точка в 'once()'. Я обновил свой ответ. –

0

Я предполагаю, что вы хотите получить все существующие данные из firebase сразу, так как больше данных приходит вслушивание этих изменений данных. Если это ваш случай, посмотрите на метод один раз() в firebase

+0

Да, но мне нужно запустить функцию «on» после того, как один раз закончен. как это сделать? –

2

Да, это возможно. Сначала вам нужно оставить пустой параметр ref, поэтому вы получите всю информацию с корневого узла (все ваши данные). Он будет запускаться в первый раз, когда он запускается по умолчанию и будет запускаться снова при любых изменениях данных из-за параметра 'value'. Вместо вас вы можете использовать child_added, child_changed, child_removed или child_moved, чтобы сократить количество полученных данных от firebase. Пример:

firebase.database().ref().on('value', function(snapshot){ 
    myFunction(snapshot.val()); 
}; 

P.S. Не забудьте указать данные из моментального снимка с помощью snapshot.val().

+0

Мне это нравится, его творческий подход. поэтому я могу поместить мой узел в другой, например: firebase.database(). ref ('/ users /' + this.userId + '/ main/info') –

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