當使用AngularJS 的Once() 函數從Firebase 檢索資料時,可能會遇到以下問題:當在函數作用域之外使用時,引用將變為未定義。這是由於 Firebase 資料檢索的非同步性質造成的。
在提供的程式碼片段中,附加 Firebase 偵聽器後的 console.log(userList) 語句傳回未定義。這是因為分配 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); }); }
使用 Async/Await (ES2017):
使用 ES2017,您可以使用 async/await 語法來非同步程式碼同步。 getUsers() 函數應標記為非同步:
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中文網其他相關文章!