首页 > 解决方案 > 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})

标签: javascriptfirebasegoogle-cloud-functions

解决方案


要分离线程,我建议使用Background Functions

后台功能可以由源自 Pub/Sub 甚至 Firestore 或 Firebase 实时数据库的 Google Cloud 事件直接调用(目前处于 Beta 版)。这是您的函数可以响应的事件的完整列表。

当您的 Promise 解决且没有错误时,您可以将 pub/sub 消息与数据聚合的结果一起发送到另一个函数。在这里您可以找到 Pub/Sub 触发器的文档

但是,现在您还可以为实时数据库设置事件处理程序。因此,您的后台函数可以直接响应 onWrite()(在创建、更新或删除数据时触发)或 onCreate()、onUpdate() 等事件。


推荐阅读