AngularJS で Once() 関数を使用して Firebase からデータを取得する場合、次の問題が発生する可能性があります。参照は、関数のスコープ外で使用されると未定義になります。これは、Firebase データ取得の非同期の性質によるものです。
提供されたコード スニペットでは、Firebase リスナーをアタッチした後の console.log(userList) ステートメントは unknown を返します。これは、userList 変数が割り当てられたときにデータ取得プロセスが完了していないためです。
解決策:
この問題を解決するには、いくつかの方法があります:
コールバックでユーザー リストを使用する:
once() 関数のコールバック内でユーザー リストに非同期的にアクセスします。これにより、続行する前にデータの取得が完了していることが保証されます。
ref.once('value', function(snapshot) { users = snapshot.val(); // ... Process and log user data within the callback ... });
Promise を返す:
ユーザーと解決する getUsers() 関数から Promise を返します。取得が完了するとデータが保存されます。これにより、よりクリーンなチェーン コードが可能になります。
this.getUsers = function() { var ref = firebase.database().ref('/users/'); return ref.once('value').then(function(snapshot) { // ... Process and return user data ... }).catch(function(error){ alert('error: ' + error); }); }
Use Async/Await (ES2017):
ES2017 では、async/await 構文を使用して次のことを行うことができます。非同期コードはより同期に似ています。 getUsers() 関数は async としてマークする必要があります:
this.getUsers = async function() { var ref = firebase.database().ref('/users/'); return ref.once('value').then(function(snapshot) { // ... Process and return user data ... }).catch(function(error){ alert('error: ' + error); }); }
次に、async/await を使用して getUsers() 関数を呼び出します:
async function getAndLogUsers() { const userList = await userService.getUsers(); console.log(userList); }
Firebase データ取得の非同期の性質を理解するこのような問題を防ぐためには重要です。上記で概説したアプローチは、Firebase データに確実にアクセスし、参照が正しく維持されるようにするための効果的なソリューションを提供します。
以上が私の Firebase 参照が「once()」関数の外で未定義なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。