我使用 firebase-js-sdk(在 Vue PWA 中(来监听来自 Firestore 的实时更新。
为了在后台恢复应用程序,我使用"vuex-persist"作为应用程序状态。除了应用程序状态之外,我还需要通过对具有相同参数的同一集合调用 .onSnapshot 来重新建立实时查询。
我想知道firebase-js-sdk是否能够重用实时查询,这是在应用程序进入后台之前请求的。否则,每次用户切换到后台并返回时,我都会被收费。
感谢您的任何帮助,托马斯
解决方案:问题不在于如何使恢复(包括实时侦听器的恢复(在技术上工作。我主要感兴趣的是如何避免每次发生此类实时侦听器的恢复时被收费。
根据这两个答案:
- https://stackoverflow.com/a/46579895
- https://groups.google.com/d/msgid/google-cloud-firestore-discuss/c9866398-c65a-4d3e-8c2e-a41241b3d026%40googlegroups.com?utm_medium=email&utm_source=footer
如果满足以下先决条件,则不会向我收费:
- 我重新创建相同的查询(这反过来又生成相同的 resumeToken。恢复令牌是一种键,Firestore服务器端使用它来再次识别查询(
- 该查询的结果集的数据未更改(firestore 跟踪查询最多 30 分钟,如果发生更改,结果集将使结果集无效(
- 启用持久性,使客户端 SDK 能够提供本地缓存的结果集
- 结果集是在过去 30 分钟内生成的(Firestore 跟踪查询的最长时间(。 如果它较旧,则查询将再次执行,然后我为此付费。
您应该在主页面中初始化您的 Firebase.js或者基本上是在应用启动或置于前台时始终启动的页面,这样即使您再次来到前台时侦听器被分离,Firebase 也会启动,因此可以创建新的侦听器。
所以在你的主方面.js你会有这样的东西:
import Firebase from 'firebase'
let config = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
storageBucket: "...",
messagingSenderId: "..."
};
let app = Firebase.initializeApp(config)
let db = app.database()
let booksRef = db.ref('books')
//....etc///
如果设置正确,并在每次加载页面时运行的方法中设置侦听器,则始终具有侦听器。只要确保避免创建多个侦听器即可。