为什么“ onSnapshot” google firebase如此之快,立即被触发?

时间:2020-05-03 12:02:59

标签: reactjs firebase google-cloud-firestore react-hooks

我构建了一个简单的React应用来测试Google Firebase。有人知道onSnapshot方法如何工作吗?我的意思是,它是如此之快(就像立即一样),即使当我在devtools中将网络更改为慢速3G时,它仍然非常快。我在XHR标签中注意到,当应用向Firebase发出请求时,请求仍处于待处理状态,但是onSnapshot已被触发并更改了我的react应用中的状态。我以为它将等到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只是将应用程序状态存储在某个地方,还是只是在发出请求时简单地读取应用程序状态然后更新状态(调用onSnapshot)?如果是这种情况,那么您将无法处理网络错误(或者可以,但是那会很奇怪),因为应用程序状态已经更改。

调用此功能(以下功能是将集合添加到Firebase数据库)时,firebase是否更新了应用程序状态?甚至没有等到请求成功?

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

3 个答案:

答案 0 :(得分:1)

firebaser here

当您从应用程序写入Firestore时,该应用程序中的Firestore客户端会立即为该数据的本地侦听器触发事件​​。

因此,在您致电firebase.firestore().collection("expense").add(value)之后,Firestore客户端会执行以下操作:

  1. 将新数据发送到服务器。
  2. 立即呼叫任何本地监听者/expenses

这是第二步,它使本地机会立即显示出来,因为它不等待服务器完成写操作。

这会导致一个可能的问题:如果服务器拒绝写操作(例如因为它与数据库的安全规则冲突),会发生什么?如果发生这种情况,则会采取一些其他步骤:

  1. 服务器根据安全规则检查写入并拒绝。
  2. 然后,客户端会触发本地状态的对帐事件,因此它将在删除文档的情况下再次调用您的onSnapshot侦听器。

由于这些额外的步骤,如果它违反了应用程序的安全规则,则可能会短暂地看到新文档出现然后被删除。

答案 1 :(得分:0)

很可能已启用offline storage

答案 2 :(得分:0)

我想我找到了,这要归功于Aprillion提到this explanation

Firebase会缓存您获取的数据,从中读取数据并基于该数据更新状态,同时仍会发出网络请求,这就是为什么它会立即