请务必管理函数的生命周期,以确保其正确解析。通过正确终止函数,您可以避免运行时间过长或无限循环的函数产生过多费用。此外,您可以确保运行函数的 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 Realtime Database 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