该问题是Firestore offline cache的后续问题。我已经阅读了离线缓存documentation,但有一点感到困惑。
一个评论者在上一个问题(〜年之前)中回答:
您与数据库交互的Android代码将相同 无论您是否已连接,因为SDK都可以正常工作。”
在API documentation for DocumentReference's set method中,我只是注意到它说:
返回
non-null Promise containing void
一次解决的承诺 数据已成功写入后端。 (请注意, 离线时无法解决)。
强调我的。文档中的这一点是否暗示代码的行为不一样,还是我遗漏了一些东西?如果我等待.set()进行解析,然后再允许一些用户交互,这听起来像是我需要对脱机情况下的代码进行调整,与通常不同。
CollectionReference's add method使我更加担心。它没有完全相同的注释,但说(强调我):
一个Promise,它在将新创建的文档写入后端后,使用DocumentReference进行解析。
这有点模糊,因为不确定“后端”在这种情况下是否是“缓存”和“服务器”的超集,或者是否仅表示服务器。如果这个方法不能解决,那就意味着以下方法不起作用,对吗?
return new Promise((resolve, reject) => {
let ref = firestore.collection(path)
ref.add(data)
.then(doc => {
resolve({ id: doc.id, data: data })
})
...
})
这意味着.add()无法解析,.then()无法运行,并且我将无法访问刚刚添加的文档的id
。我希望我只是误解了一点,我的代码可以继续按原样联机和脱机运行。
答案 0 :(得分:0)
您在这里有两个问题,它们并没有真正的关系。我将分别对它们进行解释。
在大多数情况下,开发人员通常不关心文档更新中的承诺是否真正得以解决。几乎总是“生与死”。只要应用程序的行为相同(无论如何),该应用程序就会知道该更新已在服务器上获得了什么?本地缓存已更新,并且即使更新尚未与服务器同步,以后所有的查询都将显示文档已更新。
主要例外是交易。 Transactions要求服务器处于联机状态,因为需要在客户端和服务器之间进行往返,以确保更新是原子性的。事务根本无法离线工作。如果您需要知道某笔交易是否有效,则需要在线。与普通文档写入不同,事务不会持久保存在本地缓存中。如果应用程序在服务器上的事务完成之前被杀死,则事务将丢失。
您的第二个关注点是有关新添加的文档的信息,该文档的ID在更新时未定义。的确,add()
返回一个仅在服务器上存在新文档时才解决的承诺。在诺言为您提供新文档的DocumentReference
之前,您不知道文档的ID。
如果这种行为对您不起作用,则可以通过简单地调用不带参数的doc()
而不是add()
来为文档生成新的ID。 doc()
立即返回尚未编写的新(将来)文档的DocumentReference(直到您选择编写它)。在doc()
和add()
的情况下,这些DocumentReference对象都包含在客户端上生成的唯一ID 。区别在于使用doc()
可以立即使用id,因为您会立即获得DocumentReference。使用add()
则不能,因为在承诺解决之前不会提供DocumentReference。如果您现在就需要新的文档ID, ,即使在离线状态下,也可以使用doc()
代替add()
。然后,您可以使用返回的DocumentReference离线创建文档,将其存储在本地缓存中,并在以后进行同步。然后更新将返回一个承诺,该承诺将在实际编写文档时解决。