同期、非同期、Promise

ファンクションのライフサイクルを管理して、ファンクションが適切に解決されるようにすることが重要です。関数を正しく終了することで、長時間実行される関数や無限にループする関数からの過剰な課金を避けることができます。また、関数を実行している 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 のほとんどのコードサンプルには、関数の適切な終了処理の例が含まれています。典型的な事例をいくつか紹介します。