請務必管理函式的生命週期,確保函式能正確解析。正確終止函式,可避免因函式執行時間過長或無限迴圈而產生過多費用。此外,您也可以確保在函式順利達到終止條件或狀態之前,執行函式的 Cloud Functions 例項不會關閉。
請使用下列建議方法管理函式的生命週期:
- 透過傳回 JavaScript 應許,解析執行非同步處理作業 (也稱為「背景函式」) 的函式。
- 使用
res.redirect()
、res.send()
或res.end()
終止 HTTP 函式。 - 使用
return;
陳述式終止同步函式。
使用 JavaScript 承諾簡化非同步程式碼
Promise 是用於非同步程式碼的回呼的現代替代方案。promise 代表作業和可能傳回的未來值。您也可以透過此方法在同步程式碼中傳播類似 try/catch 的錯誤。如要瞭解 Firebase SDK 中的承諾,請參閱 Firebase 部落格,以及 MDN 中的一般承諾。
Promise 與函式的運作方式
當您將 JavaScript 承諾傳回至函式時,該函式會持續執行,直到承諾解析或遭到拒絕為止。如要表示函式已順利完成工作,應解析承諾。如要指出錯誤,應拒絕承諾。也就是說,您只需處理所需的錯誤。
以下程式碼會取得 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 程式碼範例都包含適當函式終止的範例。以下列舉幾個常見的情況:
- 即時資料庫觸發事件:HTTP 函式,後面接著重新導向
- Cloud Storage 觸發條件:儲存體下載作業,後面接著
then
- Realtime Database 寫入作業的 Webhook:在
then
子句中擲回的錯誤 - 定期刪除未使用的帳戶:已遭拒絕的承諾