установить прослушиватель в режиме реального времени для сбора документов с двумя уникальными идентификаторами Firestore - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть эта функция, которая вызывается при загрузке страницы и отображении сообщений.Мне, однако, нужен слушатель в реальном времени для отображения сообщений, отправленных в коллекцию только от второго пользователя.то есть когда user2 отправляет сообщение, и оно публикуется в коллекции, а затем оно обновляется для user1

function fetchMessages(){
    dbRef= db.collection("user").doc("eF1RFw3FVAO3LFJ8ORrf7oJPyR13").collection('messages').orderBy("dbTime", "asc");
    dbRef.get().then((snapshot) =>{
        snapshot.docs.forEach(doc =>{
            if(doc.data().id===1){
                renderUser1Messages(doc);
            }
            else{
                renderUser2Messages(doc);
            }

        });
    });
}

Я думал об удалении всей функции и создании прослушивателя снимков.Это хорошо работает, когда пользователь2 отправляет сообщение, затем оно отображается пользователю1 в режиме реального времени.Однако теперь, когда пользователь1 отправляет сообщение, оно отображается дважды.Слушатель угадывает срабатывает и вызывает функцию для user1 тоже с обновленными значениями из db.

    dbRef.onSnapshot(function(snapshot) {
    snapshot.docChanges().forEach(function(change) {
     if(change.type==="added" && (change.doc.data().id==="1")){
            renderUser1Messages(change.doc);
        } else
        if(change.type==="added" && (change.doc.data().id===2)){
            renderUser2Messages(change.doc);
        }
    }); 
});

Как мне обойти это поведение

1 Ответ

0 голосов
/ 06 февраля 2019

Существует несколько типов изменений, которые могут произойти в Firestore, и каждое из них обозначено значением change.type:

  1. Добавлен новый документ, которыйобозначается значением added.В этом случае вам необходимо добавить новый документ в ваш пользовательский интерфейс.
  2. Существующий документ удаляется, что обозначено значением removed.В этом случае вам необходимо удалить существующие элементы пользовательского интерфейса для этого документа.
  3. Существующий документ изменен, что обозначено значением modified.В этом случае вам нужно обновить существующие элементы пользовательского интерфейса для этого документа.

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

Вместо этого вам нужно будет найти существующий элемент интерфейса для документа и обновить его.В качестве альтернативы вы можете обработать его, удалив существующий элемент пользовательского интерфейса и добавив новые элементы пользовательского интерфейса для документа (например, случай 2, затем случай 1).


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...