node.js - Firebase onCall 方法在代码执行完成之前完成
问题描述
我有一个相当密集的 Node 函数,其中包括多个 aync 任务,这些任务在进入下一步之前等待上一个操作完成。整个任务在被调用时完成是至关重要的。我看到onCall
函数将在代码执行完成之前结束的问题。我可以在日志中看到这一点,因为我正在控制台记录从上到下调用的各种方法,直到函数“完成”。父函数在这里:
exports.myHandyFunction = functions.https.onCall((data, context) => {
return new Promise((resolve, reject) => {
const response = async () => {
try {
let result = await some_main_function_elsewhere_in_code();
resolve(result)
} catch (err) {
console.log('parent promise caught error:')
console.log(err)
reject(err)
}
}
response()
})
})
我已经将函数的超时从 60 秒增加到 240 秒,希望这纯粹是一个函数超时问题?这非常令人不安,因为我调用了一些复杂的逻辑,但最终没有完全完成。任何帮助将不胜感激。
解决方案
您的response
功能是异步的。当您调用它时,您不会等待它的执行。这导致 oncall 方法执行的过早结束。
您可以像这样更改代码,而不是将业务逻辑包装在异步函数中,包装在 Promise 中:
exports.myHandyFunction = functions.https.onCall((data, context) => {
return new Promise(async (resolve, reject) => {
try {
let result = await some_main_function_elsewhere_in_code();
resolve(result)
} catch (err) {
console.log('parent promise caught error:')
console.log(err)
reject(err)
}
})
})
基本上,Promise 被声明为异步,因此我们可以在其中使用 await 构造函数。然后,我们只需要调用 some_main_function_elsewhere_in_code 方法,等待它。
推荐阅读
- sql - SQL WITH AVG GROUP BY
- sql - 子查询未从其他表返回计数值
- javascript - 来自单独应用程序的反应组件未集成到主应用程序中
- java - 获取 java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败
- flutter - Flutter/Firebase 命令 PhaseScriptExecution 失败,退出代码非零,
- excel - VBA将单元格值保存到新文件而不格式化
- python - 使用正则表达式在列表中查找与输入字符串匹配的单词
- node.js - 无法部署到 Meteor Galaxy,我不断收到“错误:必须在环境中设置 MONGO_URL”
- ios - CollectionView 单元格滚动时的背景变化
- go - 在浏览器中生成文档并重定向