簡體   English   中英

檢測是否從Java中的Firebase中檢索數據

[英]Detect if data is retrieved from Firebase in Javascript

我正在開發Web應用程序,並通過以下方式維護Firebase中的數據。

在此處輸入圖片說明

在“用戶”節點下可以有多個節點,在每個節點中,我正在存儲用戶信息,例如姓名,性別等。

現在,我正在嘗試使用以下Javascript函數檢索所有用戶的名稱。

function getList(){
    var nameList = new Array();
    var uidList = new Array();
    var query = firebase.database().ref('Users');

    query.once("value").then(function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
            var name = childSnapshot.val().Name;
            var uid = childSnapshot.key;
            alert(name);  //first alert
            nameList.push(name);
            uidList.push(uid);
        });
    });

    var len = nameList.length;
    alert(len); //second alert
}

當我在瀏覽器上運行它時,首先顯示數組的長度為0(在第二個警報中),然后顯示從數據庫中檢索到的名稱(在第一個警報中)。

為什么第二個警報在第一個警報之前執行? 從Firebase檢索數據的合適方法是什么,以便我可以檢測到已檢索到數據,然后執行進一步的代碼以獲取namelist數組的長度?

我嘗試過使用while循環,而“ name”和“ uid”為null,但這沒有用。

嘗試這個:

function getList() {
  var query = firebase.database().ref('Users');

  query.once("value").then(snapshots => snapshots.map(snapshot => ({
    name: snapshot.val().Name,
    uid: snapshot.key
  }))).then(result => {
    console.log(result);
  });
}

查詢的數組將重新映射為{ name: "name", uid: "key" }對象的數組。

您正在嘗試從回調函數填充數組,該回調函數會在將來的某個時候發生。 因此,您要在回調執行之前發出警報

我建議您使用PromiseAsync

承諾是處理此類情況的方法。 將數據推送到Firebase的函數完成后,請使用諾言異步調用來處理結果的執行,這樣警報將顯示namelist的長度。

function getList(){
    var nameList = new Array();
    var uidList = new Array();
    var query = firebase.database().ref('Users');

    let getData = new Promise((resolve, reject) => {
            query.once("value").then(function(snapshot) {
                snapshot.forEach(function(childSnapshot) {
                    var name = childSnapshot.val().Name;
                    var uid = childSnapshot.key;
                    alert(name);  //first alert
                    nameList.push(name);
                    uidList.push(uid);
                });
                resolve(nameList)
            })
        });

    getData.then((nameList) => {
        alert(nameList.length)
    })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM