Подтвердить что ты не робот

Firebase child_added только для новых товаров

Я использую Firebase и Node с помощью Redux. Я загружаю все объекты из ключа следующим образом.

firebaseDb.child('invites').on('child_added', snapshot => {
})

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

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

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

Каким будет лучший образец для достижения этой цели?

Спасибо,

4b9b3361

Ответ 1

Я решил проблему, используя следующий метод.

firebaseDb.child('invites').limitToLast(1).on('child_added', cb)
firebaseDb.child('invites').on('child_changed', cb)

limitToLast (1) получает последний дочерний объект приглашений, а затем прослушивает любые новые, передавая объект моментального снимка в обратный вызов cb.

child_changed прослушивает приглашение любого дочернего обновления, передавая снимок на cb

Ответ 2

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

Другие решения будут либо:

Используйте логическое значение, которое предотвратит использование старых добавленных объектов callback

let newItems = false

firebaseDb.child('invites').on('child_added', snapshot => {
  if (!newItems) { return }
  // do
})

firebaseDb.child('invites').once('value', () => {
  newItems = true
})

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

Или, если у вас есть отметка времени в ваших приглашениях, сделайте что-то вроде

firebaseDb.child('invites')
  .orderByChild('timestamp')
  .startAt(Date.now())
  .on('child_added', snapshot => {
  // do
})