Firestore离线缓存和承诺

时间:2018-09-13 03:35:12

标签: javascript google-cloud-firestore offline

该问题是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。我希望我只是误解了一点,我的代码可以继续按原样联机和脱机运行。

1 个答案:

答案 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离线创建文档,将其存储在本地缓存中,并在以后进行同步。然后更新将返回一个承诺,该承诺将在实际编写文档时解决。