Как отделить начальную нагрузку от инкрементальных детей с Firebase?

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

При загрузке приложения я хотел бы обработать начальные тысячи по-разному от последующих потомков, которые просачиваются каждые 5 секунд.

Вы можете предложить мне использовать значение, обрабатывать все, а затем использовать children_added. Но я считаю, что если обработка занимает слишком много времени, у меня есть потенциал пропустить точку.

Есть ли способ сделать это в Firebase, который гарантирует, что я не пропущу точку?

Ответ 1

Так как события child_added для исходных, предварительно загруженных данных срабатывают до того, как событие value срабатывает у родителя, вы можете использовать событие value как своеобразное уведомление об исходных данных. Вот код, который я слегка изменил из fooobar.com/questions/39114/....

var initialDataLoaded = false;
var ref = new Firebase('https://<your-Firebase>.firebaseio.com');

ref.on('child_added', function(snapshot) {
  if (initialDataLoaded) {
    var msg = snapshot.val().msg;
    // do something here
  } else {
    // we are ignoring this child since it is pre-existing data
  }
});

ref.once('value', function(snapshot) {
  initialDataLoaded = true;
});

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

Если вы беспокоитесь о загрузке всех этих исходных данных, когда вам это действительно не нужно, я буду следовать рекомендациям @FrankvanPuffelen в комментариях, чтобы использовать timestamped query. Это работает очень хорошо и оптимизировано с использованием запросов Firebase.

Ответ 2

Улучшен ответ от @jacobawenger, чтобы не использовать глобальную переменную состояния

var ref = new Firebase('https://<your-Firebase>.firebaseio.com');

ref.once('value', function(snapshot) {
  // do something here with initial value

  ref.on('child_added', function(snapshot) {
    // do something here with added childs
  });

});

Ответ 3

Существует два возможных решения этой проблемы, не удовлетворяющие:

1) Отметьте ваши дети и запросите только детей, у которых метка времени больше, чем значение "сейчас". Это не здорово, потому что у вас может возникнуть синхронность между вашим приложением "сейчас" и "сейчас" на то, что толкает данные на Firebase или значение сервера Firebase для "сейчас".

2) Использовать значение и добавить ребенка. Любые дубликаты, увиденные в child_added, которые уже были замечены в ценности, могут быть отброшены. Это невозможно использовать для больших наборов данных, так как требует загрузки всех исторических данных TWICE!

Почему не может быть такой команды, как "child_added", которая НЕ дает все когда-либо?