请务必管理函数的生命周期,以确保其正确解析。通过正确终止函数,您可以避免运行时间过长或无限循环的函数产生过多费用。此外,您可以确保运行函数的 Cloud Functions 实例在函数成功达到终止条件或状态之前不会关闭。
使用以下这些建议的方法来管理函数的生命周期:
- 通过返回 JavaScript promise 来解析执行异步处理的函数(也称为“后台函数”)。
- 使用
res.redirect()
、res.send()
或res.end()
终止 HTTP 函数。 - 使用
return;
语句终止同步函数。
使用 JavaScript promise 简化异步代码
Promise 是异步代码回调的新式替代方案。Promise 代表一项操作及其可能返回的未来值。它还会让您在同步代码中传播类似于 try/catch 的错误。您可以在 Firebase 博客上了解 Firebase SDK 中的 Promise,并在 MDN 上大致了解 Promise。
Promise 如何与函数结合使用
当您向函数返回 JavaScript promise 时,该函数将一直运行,直到 promise 得到解析或遭到拒绝。要指示函数已成功完成其工作,应解析该 promise。要指示错误,则应拒绝 promise。也就是说,您只需处理想要处理的错误即可。
以下代码采用 Firebase 实时数据库 ref
并将其值设置为 "world!"
。通过返回 set
的结果,系统会保证您的函数持续运行,直到将字符串写入数据库的异步工作全部完成为止:
// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
// set() returns a promise. We keep the function alive by returning it.
return event.data.ref.set('world!').then(() => {
console.log('Write succeeded!');
});
});
上下文中的示例
我们的大部分 Cloud Functions 代码示例都会示范正确的函数终止。以下是演示一些典型使用情形的示例:
- Realtime Database 触发器:HTTP 函数,后跟重定向
- Cloud Storage 触发器:存储空间下载,后跟
then
- 关于 Realtime Database 写入的网络钩子:在一个
then
子句中抛出的错误 - 定期删除未使用的帐号:被拒绝的 Promise