繁体   English   中英

离线时如何丢弃挂起的 DocumentReference 写入?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM