gpt4 book ai didi

javascript - Firestore 离线缓存和 promise

转载 作者:行者123 更新时间:2023-11-30 20:12:03 25 4
gpt4 key购买 nike

这个问题是关于 Firestore offline cache 的后续问题.我读过离线缓存 documentation但有一点我很困惑。

一位评论者回答了上一个问题(~ ​​一年前):

You Android code that interact with the database will be the same whether you're connected or not, since the SDK simply works the same."

API documentation for DocumentReference's set method ,我刚刚注意到它说:

Returns non-null Promise containing void A promise that resolves once the data has been successfully written to the backend. (Note that it won't resolve while you're offline).

强调我的。文档中的这一点不会表明代码的行为不一样,还是我遗漏了什么?如果我在允许某些用户交互之前等待 .set() 解析,这听起来像是我需要针对离线情况调整代码,而不是通常情况下。

CollectionReference's add method让我更担心一点。它没有完全相同的注释,但说(强调我的):

A Promise that resolves with a DocumentReference pointing to the newly created document after it has been written to the backend.

这有点模糊,因为不确定这种情况下的“后端”是“缓存”和“服务器”的超集,还是仅表示服务器。如果这个没有解决,那就意味着下面的方法不起作用,对吗?

return new Promise((resolve, reject) => {
let ref = firestore.collection(path)
ref.add(data)
.then(doc => {
resolve({ id: doc.id, data: data })
})
...
})

意思是,.add() 不会解析,.then() 不会运行,我也无法访问刚刚添加的文档的 id。我希望我只是误会了什么,我的代码可以继续在线和离线运行。

最佳答案

这里有两个问题,它们实际上并不相关。我将分别解释它们。

在大多数情况下,开发人员通常不关心来自文档更新的 promise 是否实际解决。它几乎总是“即发即弃”。只要应用程序无论如何都以相同的方式运行,那么如果应用程序知道更新已到达服务器,它会获得什么好处?本地缓存已更新,所有 future 的查询都将显示文档已更新,即使更新尚未与服务器同步。

主要的异常(exception)是交易。 Transactions要求服务器在线,因为需要在客户端和服务器之间进行往返以确保更新是原子的。交易根本无法离线进行。如果您需要知道交易是否有效,您需要在线。与正常的文档写入不同,事务不会持久保存在本地缓存中。如果应用程序在服务器上的事务完成之前被终止,则事务将丢失。


您的第二个问题是新添加的文档,其中文档的 id 在更新时未定义。的确,add() 返回一个只有在服务器上存在新文档时才会解析的 promise 。在 promise 为您提供新文档的 DocumentReference 之前,您无法知道文档的 ID。

如果此行为对您不起作用,您可以通过简单地调用 doc() 为文档生成一个新的 ID。没有参数而不是 add()doc() 立即返回尚未写入(直到您选择写入)的新( future )文档的 DocumentReference。在 doc()add() 这两种情况下,这些 DocumentReference 对象都包含在客户端生成 的唯一 ID。不同之处在于使用 doc(),您可以立即使用 id,因为您会立即获得一个 DocumentReference。使用 add() 时,您不能这样做,因为 DocumentReference 在 promise 解决之前不会提供。如果您现在需要新文档 ID,即使在离线状态下,也可以使用 doc() 而不是 add()。然后,您可以使用返回的 DocumentReference 离线创建文档,存储在本地缓存中,稍后同步。然后,更新将返回一个 promise ,该 promise 会在实际编写文档时解决。

关于javascript - Firestore 离线缓存和 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52306278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com