同期、非同期、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 のほとんどのコードサンプルには、ファンクションの適切な終了処理の例が含まれています。典型的な事例をいくつか紹介します。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。