Почему «onSnapshot» Google Firebase так быстро, мгновенно срабатывает? - PullRequest
0 голосов
/ 03 мая 2020

Я создаю простое приложение реагирования для тестирования Google Firebase. Кто-нибудь знает, как работает метод onSnapshot? Я имею в виду, что это так быстро (например, мгновенно), даже когда я переключаю сеть на медленный 3G в devtools, это все еще быстро. Я заметил на вкладке XHR, когда приложение отправило запрос в firebase, запрос все еще находится на рассмотрении, но onSnapshot уже сработал и изменил состояние в моем приложении реакции. Я думал, что он подождет до тех пор, пока не получит ответ от firebase, но это не так.

.firestore()
  .collection("expense")
  .onSnapshot((snapshot) => {
    const newExpense = snapshot.docs.map((doc) => {
      return {
        id: doc.id,
        ...doc.data(),
      };
    });

    //set state is fired, but request is still pending
    this.setState({expense: newExpense});
  });

Действительно ли firebase просто где-то хранит состояние приложения, или просто читает состояние приложения, а затем обновляет состояние (call onSnapshot) при оформлении запроса? Если это так, то вы не можете обработать сетевую ошибку (или вы можете, но это было бы странно), потому что состояние приложения уже изменилось.

Обновлял ли Firebase состояние приложения, когда эта функция (функция ниже предназначена для добавить коллекцию в базу данных Firebase) называется? и даже не дождался, пока запрос будет успешным?

firebase.firestore().collection("expense").add(value);

Ответы [ 3 ]

1 голос
/ 03 мая 2020

firebaser here

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

Итак после вашего звонка на firebase.firestore().collection("expense").add(value) клиент Firestore делает:

  1. Отправляет новые данные на сервер.
  2. Вызывает всех локальных слушателей на /expenses сразу.

Это второй шаг, который мгновенно отображает локальные шансы, поскольку он не ждет, пока сервер завершит операцию записи.

Это приводит к возможной проблеме: что происходит если сервер отклоняет операцию записи (например, потому что это противоречит правилам безопасности вашей базы данных)? Если это произойдет, предпринимаются еще несколько шагов:

Сервер проверяет запись на соответствие правилам безопасности и отклоняет ее. Затем клиент запускает события согласования для локального состояния, поэтому он снова вызывает вашего onSnapshot прослушивателя с удаленным документом.

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

0 голосов
/ 03 мая 2020

Я думаю, что нашел его, спасибо Aprillion за упоминание этого объяснения

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

0 голосов
/ 03 мая 2020

Скорее всего, автономное хранилище включено.

...