Получить только новый "добавленный ребенок" после загрузки страницы

У меня есть уведомление о стиле facebook в верхнем правом углу. Я показываю там до 5 последних уведомлений. Я начинаю сначала с помощью child_added, а также после того, как firebaseRef child_added прослушивает новые уведомления.

Теперь я хочу воспроизвести звук при новом уведомлении и немного новых уведомлений.
Единственное, что я не могу понять, это как отличить, когда было новое уведомление, и когда оно уже было видно, перезагрузка страницы a.k.a? Есть ли другой подход, чем создание какого-либо нового свойства read?

Я искал вокруг и нашел некоторые старые ответы с 2012 года с предложениями limitToLast (1), которые не помогают в моем случае.

EDIT:

qaru.site/info/39114/... Это ответы @Kato рекомендует слушать только новые уведомления, время которых больше текущего времени Firebase Firebase.ServerValue.TIMESTAMP. Это похоже на путь, но я создаю новое уведомление с REST API и сам устанавливаю timestamp как мой UTC сервера. Таким образом, могут быть некоторые незначительные несоответствия. Не должно быть большой сделки

ИЗМЕНИТЬ 2:

С этим запросом я получаю корректно до 5 последних уведомлений при загрузке страницы, после чего новые уведомления не появляются

notifRef.limitToLast(5).once("value", function(snapshot) {
    snapshot.forEach(function(data) {
        addNotifications(data.val());
    });
});

В вышеперечисленном соединении другой SO-поток @Kato ответ не работает, notifRef.orderBy is not a function.
Я попробовал несколько других версий в соответствии с doc
https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries

Моя структура такая же

{
  "messages": {
     "$messageid": { // firebase generated key 'JqcEWLFJrl1eaed5naN'
        "sender": "kato",
        "message": "hello world"
        "timestamp": 1433036536108  // Firebase.ServerValue.TIMESTAMP
     }
  }
}

Вот что я пытался сделать и ошибки, которые я получаю:

var queryRef = notifRef.orderByKey().startAt(Firebase.ServerValue.TIMESTAMP);
Ошибка: Query: When ordering by key, the argument passed to startAt(), endAt(),or equalTo() must be a string.

var queryRef = notifRef.orderByChild('timestamp').startAt(Firebase.ServerValue.TIMESTAMP);
Ошибка: Query: First argument passed to startAt(), endAt(), or equalTo() cannot be an object.

В документации я не видел, чтобы начинать что-либо, кроме элемента позиции передается (целое число), но не объект временной метки firebase, поэтому такая ошибка.

Только ниже компиляции, просто имея startAt без заказа, но он не снимает никаких новых уведомлений!

var queryRef = notifRef.startAt(Firebase.ServerValue.TIMESTAMP);
queryRef.on('child_added', function(snap) {
    console.log(snap.val());
    addNotifications(snap.val());
    // TODO clean up if more than 5 notifications
});

Любая идея, где может быть проблема? Каков правильный способ прослушивания только новых уведомлений, чем текущая временная метка?

РЕДАКТИРОВАТЬ 3

Вот мое окончательное решение

notifRef.limitToLast(5).once("value", function(snapshot) {
    var lastKey = null; // at least 1 key is always present
    var count = 0; // because startAt is inclusive, we have to ignore first child_added
    snapshot.forEach(function(data) {
        addNotifications(data.val());
        lastKey = data.key();
    });
    checkNotifications();
    notifRef.orderByKey().startAt(lastKey).on('child_added', function(snap) {
        if (count > 0) {
            console.log(snap.val());
            addNotifications(snap.val());
            // TODO clean up if more than 5 notifications
            checkNotifications();
        }
        count++;
    });
});

Я не доверяю времени браузера, поэтому сначала нужно было запросить последние 5 существующих ключей, а после этого передать startAt последний полученный ключ. notifRef.orderByKey().startAt(lastKey) не может быть снаружи notifRef.limitToLast(5).once("value", потому что согласно doc, once запрашивается последним, поэтому переменная lastKey js, переданная в startAt, всегда будет равна нулю. Также необходимо иметь переменную count, потому что startAt принимает включительно, но поскольку она уже была там, мне нужно игнорировать первый.
Также с этим решением, когда есть более 5 уведомлений, я запрашиваю свой бэкэнд с помощью checkNotifications только один раз в конце, когда уведомления получаются с запросом once. В противном случае на child_added он будет делать до 5 раз при каждой загрузке страницы.

Если есть что-то, что можно было бы оптимизировать, сообщите

Ответ 1

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

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