2017-01-13 62 views
0

我在我的數據庫中有這樣的結構 tree 兩個節點包含我的網絡的消息信息,在節點'消息'我已經存儲了所有消息的信息,並在節點'用戶消息'我已創建了對這些消息的引用,例如,當用戶發送消息時,該消息的密鑰存儲在此節點(User-messages)中,從而創建該用戶具有的所有消息的密鑰列表發送,這將有助於找到哪些信息屬於特定用戶在所有發送的郵件列表Firebase中的嵌套查詢,如何使用JavaScript顯示恢復的數據?

tree example

var RefMessage=new Firebase('https://chatfbexample.firebaseio.com/user-messages/332'); 
    var oMessages=[]; 
    var All= new Firebase('https://chatfbexample.firebaseio.com/all-messages'); 
    RefMessage.on("value",function(snapshot){ 

      snapshot.forEach(function(snap){ 
       var key=snap.key(); 
       var mensajeR=All.child(key); 
       mensajeR.on('value',function(snap){ 
       var id=snap.val().id; 
       oMessages[id]=[]; 
       oMessages[id]['id']=id; 
       }); 

      }); 

     for(i in oMessages) 
     { 
      console.log(oMessages[i]['id']); 
     } 
     }); 

我將數據存儲在數組中,因爲我只想獲取已存儲的最後一個值(消息),但是當我試圖用循環顯示數據時,它不會返回任何東西給我,如果我檢查數組,我發現這些值已被存儲,事實上,在不使用'for'的情況下做一個控制檯日誌顯示了我的數組,我的問題是,如何在檢索後顯示這些數據?

回答

1

這是因爲firebase調用是異步運行的,當for循環執行時,它沒有完成調用。查看承諾,然後在.on完成時關閉。

如果你改變你的代碼如下:

var RefMessage = new Firebase('https://chatfbexample.firebaseio.com/user-messages/332'); 
var oMessages = []; 
var All = new Firebase('https://chatfbexample.firebaseio.com/all-messages'); 
RefMessage.on("value", function (snapshot) { 

    snapshot.forEach(function (snap) { 
     var key = snap.key(); 
     var mensajeR = All.child(key); 
     mensajeR.on('value', function (snap) { 
      console.log('done call'); 
      var id = snap.val().id; 
      oMessages[id] = []; 
      oMessages[id]['id'] = id; 
     }); 

    }); 
    console.log('trying loop'); 

    for (i in oMessages) { 
     console.log(oMessages[i]['id']); 
    } 
}); 

你會看到「試圖循環」控制檯日誌之前「完成調用」一個(或多個)。

相關問題