javascript - Firebase功能分离线程?
问题描述
我有一个函数,调用时应该获取集合中的所有文档 id,然后为每个 id 运行另一个函数。我不希望初始函数等待循环函数的响应(即触发并忘记)
伪代码:
UpdateAllItems(){
return this.getDocumentIds().then(ids => {
ids.forEach(id => {
this.updateItem(id) //returns a Promise
})
}
}
如果我跟踪 updateItem 中的执行步骤,我会同时看到每次迭代的日志。假设数组中有 10 个 id,updateItem 的第一步是获取文档信息,我看到 10 条“获取文档”日志,然后 10 秒后我看到 10 条“获取步骤 2 信息”日志。
如果我要在上面的 psuedo 中运行相同的 id 10 次,则需要 60 秒。如果我在 Postman 中运行相同的 updateItem 调用,我可以在 10 秒内手动调用 10。
为什么这个循环似乎增加了它所花费的时间?
请注意,在 updateItem 内部,它对其他文档进行 3 次调用,聚合该数据,然后执行 .set(data, {merge, true})
解决方案
要分离线程,我建议使用Background Functions。
后台功能可以由源自 Pub/Sub 甚至 Firestore 或 Firebase 实时数据库的 Google Cloud 事件直接调用(目前处于 Beta 版)。这是您的函数可以响应的事件的完整列表。
当您的 Promise 解决且没有错误时,您可以将 pub/sub 消息与数据聚合的结果一起发送到另一个函数。在这里您可以找到 Pub/Sub 触发器的文档
但是,现在您还可以为实时数据库设置事件处理程序。因此,您的后台函数可以直接响应 onWrite()(在创建、更新或删除数据时触发)或 onCreate()、onUpdate() 等事件。
推荐阅读
- qt - 如何使用受保护的函数 setLocalPort?
- java - 我在自己的 LinkedList 类中引用“头”节点时遇到问题
- entity-framework-core - 使用 Entity Framework Core 方法语法为组选择一条记录
- git - 使用 git repo 使其他 gatsby 站点保持同步
- html - 最后将表格与图像居中对齐
- html - 如何使用可见滚动条制作离子列表?
- java - Camel 中的两条路由是否引用相同的处理 bean 并行执行?
- java - 参数列表的流过滤条件
- bash - 使用 bash ls 命令仅列出基于中间部分的文件
- python - 减少在 Python 中运行多个 group by 的时间