Firebase では、once() 関数の外で参照が失われるのはなぜですか?
Firebase は、データ管理のための柔軟で強力な API を提供します。その重要な機能の 1 つは、データを非同期的に読み書きできることです。ただし、この質問が示すように、この非同期の性質により、予期しない結果が生じる場合があります。
この問題は、once() 関数を使用してデータベースからユーザーのリストを取得するときに発生します。データは、once() コールバック内で正常にフェッチされますが、コールバック外でデータにアクセスしようとすると、結果は未定義になります。これは、once() 関数の非同期実行により、データをカプセル化するスコープが作成されるためです。
この動作を理解するには、次のコードの簡略化されたバージョンを検討してください。
ref.once('value').then(function(snapshot) { console.log("got value"); }); console.log("after attaching listener");
期待されるこのコードの出力は次のとおりです:
before attaching listener after attaching listener got value
ただし、実際の出力は次のとおりです:
before attaching listener after attaching listener got value
これは、listener ステートメントをアタッチした後のステートメントが、一度だけ実行されたにもかかわらず、get value ステートメントの前に実行されることを示しています。 () 関数は非同期です。これは、once() 関数がメインスレッドをブロックしないためです。データを待機するリスナーをアタッチし、データが利用可能になったらコールバック関数を実行します。
この問題に対処し、コールバックの外部でデータに確実にアクセスできるようにするには、いくつかのオプションが利用可能です。
コールバックでのユーザー リストの使用:
ユーザー リストにアクセスする必要があるコードをコールバックに直接移動します。これにより、データを別の変数に転送する必要がなくなります。
Promise を返す:
ユーザーと解決する Promise を返すように getUsers() 関数を変更します。リスト。これにより、.then() 関数内のデータにアクセスできるようになります。
async と await を使用する:
getUsers() 関数が Promise を返す場合、次のことが可能です。コードをより同期的に見せるには、async キーワードと await キーワードを使用します。このアプローチでは、親スコープを非同期としてマークする必要があります。
Firebase の非同期の性質を理解し、適切な手法を使用することで、データへの参照の喪失を回避し、コールバック内外の情報への信頼できるアクセスを確保できます。
以上がFirebase データ参照が「once()」関数の外で未定義になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。