請務必管理函式的生命週期,確保函式能正確解析。正確終止函式可避免因長時間執行函式或無限迴圈而產生過多費用。此外,您需確保在函式成功達到終止條件或狀態之前,執行函式的 Cloud Functions 執行個體不會關閉。
請使用以下建議方法管理函式的生命週期:
- 藉由傳回 JavaScript 承諾,解析執行非同步處理 (也稱為「背景函式」) 的函式。
- 使用
res.redirect()
、res.send()
或res.end()
終止 HTTP 函式。 - 使用
return;
陳述式終止同步函式。
藉由 JavaScript 承諾簡化非同步程式碼
Promise 是非同步程式碼回呼的新型替代方案。承諾代表作業及作業可能傳回的未來值。而且還可讓您傳播與 try/catch 類似的錯誤。如要瞭解 Firebase SDK 的承諾,請參閱 Firebase 網誌,大致瞭解 MDN 的承諾。
承諾與函式如何搭配運作
將 JavaScript 承諾傳回至函式後,該函式會繼續執行,直到 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 函式,接著會進行重新導向
- Cloud Storage 觸發條件:下載儲存空間,後面接著
then
- 在即時資料庫寫入 Webhook:
then
子句內擲回的錯誤 - 定期刪除未使用的帳戶:遭拒的承諾