我构建了一个简单的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);
答案 0 :(得分:1)
firebaser here
当您从应用程序写入Firestore时,该应用程序中的Firestore客户端会立即为该数据的本地侦听器触发事件。
因此,在您致电firebase.firestore().collection("expense").add(value)
之后,Firestore客户端会执行以下操作:
/expenses
。这是第二步,它使本地机会立即显示出来,因为它不等待服务器完成写操作。
这会导致一个可能的问题:如果服务器拒绝写操作(例如因为它与数据库的安全规则冲突),会发生什么?如果发生这种情况,则会采取一些其他步骤:
onSnapshot
侦听器。由于这些额外的步骤,如果它违反了应用程序的安全规则,则可能会短暂地看到新文档出现然后被删除。
答案 1 :(得分:0)
很可能已启用offline storage。
答案 2 :(得分:0)
我想我找到了,这要归功于Aprillion提到this explanation
Firebase会缓存您获取的数据,从中读取数据并基于该数据更新状态,同时仍会发出网络请求,这就是为什么它会立即