関数が適切に解決されるようにするには、関数のライフサイクルを管理することが重要です。関数を正しく終了することで、実行時間が長すぎる関数や無限にループする関数からの過剰な料金を回避できます。また、関数が正常に終了条件または状態に達する前に、関数を実行している Cloud Functions インスタンスがシャットダウンされないようにすることもできます。
関数のライフサイクルを管理するには、次の推奨アプローチを使用します。
- JavaScript promiseを返すことにより、非同期処理を実行する関数 (「バックグラウンド関数」とも呼ばれます) を解決します。
-
res.redirect()
、res.send()
、またはres.end()
) でHTTP 関数を終了します。 -
return;
で同期関数を終了します。声明。
JavaScript promise を使用して非同期コードを簡素化する
Promise は、非同期コードのコールバックの最新の代替手段です。 promise は、操作とそれが返す可能性のある将来の値を表します。また、同期コードの try/catch と同様のエラーを伝播することもできます。 The Firebase Blogで Firebase SDK のプロミスについて、 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 のコード サンプルのほとんどには、適切な関数終了の例が含まれています。以下に、典型的なケースをいくつか示します。
- Realtime Database トリガー: HTTP 関数とそれに続くリダイレクト
- Cloud Storage トリガー: ストレージのダウンロードと
then
に続く - Realtime Database 書き込みの Webhook :
then
句内でスローされるエラー - 使用していないアカウントを定期的に削除する: 拒否された約束