同期、非同期、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!');
  });
});

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

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