- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是关于 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/
我正在尝试为我的 Firestore 设置一个数据库,但是我尝试重新安装 pod 和许多其他东西,但我仍然无法让它工作,因为它显示了这个错误: Type 'Firestore' has no memb
我需要更改我的项目 ID,因为要验证的 Firebase 身份验证链接在链接上显示了项目 ID,并且由于品牌 reshape ,项目名称已更改。根据我发现的信息,更改项目 ID 似乎不太可能。我正在考
快速提问。长话短说,我在我的谷歌云功能日志中收到此错误: Firestore (4.10.1):无法到达 Firestore 后端。 这是我的函数文件中的代码: // pull in firebas
我正在从事 Angular 6 项目。这是我使用 --prod 构建时遇到的错误标记、主持和运行。我已经坐了很长时间了。最初认为这可能是 firestore 包的问题,我等了。但是现在更新到fir
我正在开发一个 React 项目,这是我的第一个 React 项目。此代码部署成功。但在使用 postman 测试时出现一些错误。我“发布”“createScream”函数的 URL 并发送它。然后我
我有一个包含两个集合的 Firestore 数据库:用户和锦标赛。用户具有“参与者”角色和“管理员”角色,并在用户文档中由“isParticipant”和“isAdmin” bool 值指示: /us
Firebase 数据库根据他们的文档提供了 10 MB 的离线数据库缓存限制,但没有提到 的离线数据限制。 Firestore 数据库。 Firestore 的离线数据保存限制是多少? 最佳答案 根
我正在尝试评估 string在 Firestore 安全规则 基于 matches正则表达式功能 我的代码是 username.matches('^(?!\.)(?!_)(?!.*\.$)(?!.*?
是否可以在 Firestore 中定义具有唯一约束的索引?如果没有,如何在文档字段上强制执行唯一性(不使用文档 ID)? 最佳答案 是的,这可以通过结合使用两个集合、Firestore 规则和批量写入
我正在学习 GCP,在他们的 Firestore 中,我对 Admin.firestore 和 Firebase.firestore 的区别感到困惑。 这是管理员的代码: const admin =
使用带有自定义声明的 firestore 在线安全模拟会导致错误,但它在部署时可以完美运行(同时实际处理真实请求)。错误是: Error: simulator.rules line [5], colu
所以,我知道有一些类似命名的问题,但这是不一样的。 我很想知道是否有人可以解释缺少 increment 的原因。哨兵,类似于delete一。 据我所知,字段删除与文档更新没有什么不同。意思是,我只能
我想创建两个带有分页选项的查询。在第一个记录中,我想获取前十条记录,在第二个记录中,我想获取其他所有记录: .startAt(0) .limit(10) .startAt(9) .limit(null
我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗? 设置: 我的应用程序将有许多用户将参与的测验。 每个测验都会有多个问题。 每个问题都有多个答案,只能选择一个。 每个用户只能回
我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗? 设置: 我的应用程序将有许多用户将参与的测验。 每个测验都会有多个问题。 每个问题都有多个答案,只能选择一个。 每个用户只能回
我无法在任何地方找到我可以在一个Collection中获得的文档数量的限制。假设我有1,000,000,000个文档...那有可能吗?如果我想把它们全部都拿走,实际上会给我十亿吗? 最佳答案 可以存储
假设我有一个集合 mycollection有 1,000,000 条记录。 此查询将返回多少条记录? const query = firestore.collection('mycollection'
这是错误消息:@firebase/firestore: Firestore (4.12.1): Could not reach Firestore backend 我正在构建一个网络应用程序,它今天运
我在编写和测试我的 Firestore 规则时遇到了一个奇怪的问题。这是我想要实现的目标: 当应用程序启动时,用户会匿名登录。这用户开始新游戏。 我创建了一个基本上只包含时间戳的“ session ”
我是云函数的新手。我有一些困惑。 admin.firestore 和functions.firestore? admin.database 是实时数据库吗? 因此,如果云函数基本上是用 JavaScr
我是一名优秀的程序员,十分优秀!