![](/img/trans.png)
[英]Firebase Firestore: globally detect when there are pending writes
[英]How can I discard pending DocumentReference writes when offline?
我正在使用 Firebase Firestore 文档来发布我的用户在 map 上的位置,这样他们就可以看到对方。 当他们所有人都具有良好的连接时,这会很好地工作,但有时他们的手机无法连接到 Firebase 服务器并且写入似乎被缓存:每当他们恢复连接时,所有待处理的位置写入都会批量发送。
对其他用户的影响是他们看到一个人的 position 停下来,过了一会儿他们开始快速移动,直到 map position 捕捉到真正的价值。 这很烦人并且浪费带宽。
我曾尝试禁用持久性缓存,但这无济于事(只有在传输器应用程序死机时才会有帮助,但只要它存在,位置就会缓存在内存中)。
也许问题是我不应该为此目的使用文档,还有另一种 Firebase 机制允许丢弃陈旧的写入数据以进行实时通信?
在设备脱机时执行的所有写入操作都将排队,直到重新建立与Firebase服务器的连接。 不幸的是,没有API可以帮助您控制哪些写入操作排队,哪些不是。
我能想到的最简单的解决方案是使用Firestore事务 ,这些事务当前没有持久化到磁盘,因此在应用程序脱机时会丢失。
因此,脱机使用不支持事务,无法缓存或保存以供日后使用。 这是因为事务绝对需要与服务器进行往返通信,以确保事务内的代码成功完成。 因此,您只能在联机时使用事务,因为事务是依赖于网络的。
您可以通过仅在可以连接到 firestore 的情况下发出请求来解决此问题。 这是一个帮助程序 function,它将确定您是否已连接。 它类似于使用事务,因为这两种方法都涉及发出读取请求。
如果您不打算多次调用 function,则读取成本可能可以忽略不计。 但是,为了节省读取成本,您还可以考虑 ping 一些服务器或云 function 而不是 firestore 本身。 不过,这样做可能是一种不太准确的测试与 Firestore 连接的方法。
import {
doc,
getDocFromServer,
} from "firebase/firestore"
async function canConnectToFirestore(){
//navigator.onLine can only say for certain if you're disconnected
//For more info on navigator.onLine: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine
if (!navigator.onLine)
return false
//db is initialized from getFirestore()
try{
await getDocFromServer(doc(db, "IrrelevantText","IrrelevantText"))
return true
}
catch(e){
return false
}
}
async function example(){
if(await canConnectToFirestore()) console.log("Do something with firestore")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.