<p>私の Firebase Cloud Function ファイルには、いくつかのプロパティを返す前にドキュメントの取得と更新操作を実行する次のローカル関数があります。 </p>
<pre class="brush:php;toolbar:false;">非同期関数 getRandomDocLessThanOperator(seed) {
試す {
const db = admin.firestore();
const snapshot = await db.collection("users").where("ランダム", "<=", シード)
.limit(1)
。得る();
if (スナップショット.空) {
return null; // 次に、呼び出し元は大なり演算子を試行します
}
const doc = スナップショット.docs[0];
doc.ref.update({"random": seed}); // 新しいシードで更新します
return doc.get("uid");
} キャッチ (エラー) {
新しいエラー(エラー)をスローします。
}
}</pre>
<p>この関数は正常に動作しますが、戻る前にドキュメントを非同期的に更新しようとするのが心配です。ただし、テストではドキュメントが更新されないことはありませんでした。ただし、アップデートが完了する前にこの機能がタイムアウトする可能性はありますか? </p>
<p>とにかく、問題を解決するために、<code>await</code> を使用して更新を待ってみました。
<pre class="brush:php;toolbar:false;">const doc = snapshot.docs[0];
await doc.ref.update({"ランダム": シード});
return doc.get("uid");</pre>
<p>ただし、これを実行すると、関数は期待した文字列を返しますが、ドキュメントは更新されません。 </p>
<ol>
<li>更新操作の前に <code>await</code> を追加すると更新が妨げられるのはなぜですか? </li>
<li>最初の例のように、更新を待たずに非同期で実行しても安全ですか? </li>
</ol>
更新が機能しなかった理由は明らかではありません (実行時に何が起こっているかをより明確に把握するには、より多くのログを使用できる可能性があります)。しかし、確実に言えることは、Cloud Functions を使用する場合は、 すべての 非同期作業が完了した後に解決される Promise を返さなければなりません (または、 すべての Promise が発生するまで待機します)。それ以外の場合は、関数が返されます。作業が完了する前に閉鎖される場合があります。これは開発者がよく犯す間違いです。
いいえ、これは「安全」ではありません。関数が終了した後も非同期コードが実行し続けるという保証はないからです。すべての非同期作業が完了した後にのみ解決される Promise を返す必要があります。
これについては、ドキュメントをお読みください。