請務必管理函式的生命週期,確保函式能正確解析。正確終止函式可避免函式執行時間過長或無限迴圈,進而產生過多費用。此外,您也可以確保執行函式的 Cloud Functions 執行個體不會在函式順利達到終止條件或狀態前關閉。
建議您採用下列方法管理函式的生命週期:
- 如要執行非同步處理作業 (又稱「背景函式」),請傳回 JavaScript Promise,藉此解決函式。
- 使用
res.redirect()
、res.send()
或res.end()
終止 HTTP 函式。 - 使用
return;
陳述式終止同步函式。
使用 JavaScript Promise 簡化非同步程式碼
Promise 是非同步程式碼的現代替代方案,可取代回呼。Promise 代表一項作業,以及作業日後可能傳回的值。您也可以傳播錯誤,類似於同步程式碼中的 try/catch。如要瞭解 Firebase SDK 中的 Promise,請參閱 Firebase 網誌;如要瞭解一般 Promise,請參閱 MDN。
函式如何搭配 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 程式碼範例 都包含適當終止函式的範例。以下列舉幾個例子,說明典型情況:
- 即時資料庫觸發程序: HTTP 函式,後面接著重新導向
- Cloud Storage 觸發條件:
儲存空間下載作業,後接
then
- Webhook on Realtime Database
write:
An error thrown inside a
then
clause - 定期刪除未使用的帳戶:遭拒絕的 Promise