管理函數的生命週期以確保其正確解析非常重要。透過正確終止函數,您可以避免運行時間過長或無限循環的函數產生過多費用。此外,您還可以確保在函數成功達到其終止條件或狀態之前,執行函數的 Cloud Functions 實例不會關閉。
使用這些建議的方法來管理函數的生命週期:
- 透過傳回JavaScript Promise來解析執行非同步處理的函數(也稱為「後台函數」)。
- 使用
res.redirect()
、res.send()
或res.end()
終止HTTP 函數。 - 使用 return 終止同步函數
return;
陳述。
使用 JavaScript Promise 簡化非同步程式碼
Promise 是非同步程式碼回呼的現代替代方案。 Promise 代表一個操作以及它可能返回的未來值。它還允許您傳播類似於同步程式碼中的 try/catch 的錯誤。您可以在Firebase 部落格上了解 Firebase SDK 中的承諾,並在MDN上了解一般承諾。
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程式碼範例都包含正確函數終止的範例。以下是一些典型案例:
- 即時資料庫觸發器:一個 HTTP 函數,後面接著一個重定向
- 雲端儲存觸發器:儲存下載,
then
- 即時資料庫寫入上的 Webhook :
then
子句內拋出錯誤 - 定期刪除未使用的帳戶:被拒絕的承諾