Firebase child_added только для новых товаров
Я использую Firebase и Node с помощью Redux. Я загружаю все объекты из ключа следующим образом.
firebaseDb.child('invites').on('child_added', snapshot => {
})
Идея этого метода заключается в том, что мы получаем полезную нагрузку из базы данных и используем только одно действие для обновления моих локальных хранилищ данных через редукторы.
Далее, мне нужно прослушать любые НОВОЕ или ОБНОВЛЕНО дети приглашения.
Проблема теперь, однако, в том, что событие child_added запускается для всех существующих ключей, а также для новых. Я не хочу этого поведения, мне нужны только новые ключи, так как у меня есть существующие данные.
Мне известно, что child_added обычно используется для этого типа операции, однако я хочу уменьшить количество запущенных действий и в результате получить результат.
Каким будет лучший образец для достижения этой цели?
Спасибо,
Ответы
Ответ 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
})