Javascript 异步读取数据库返回集合

Javascript 异步读取数据库返回集合,javascript,firebase,firebase-realtime-database,es6-promise,Javascript,Firebase,Firebase Realtime Database,Es6 Promise,我正在尝试实现一个函数,它将返回特定用户的所有房间。我正在使用firebase,为了获得一个特定的房间,我编写了以下函数: Db.prototype.getRoom = function (roomUid){ return new Promise(function(resolve, reject) { firebase.database().ref('rooms/' + roomUid).once('value').then(function(snapshot){ re

我正在尝试实现一个函数,它将返回特定用户的所有房间。我正在使用
firebase
,为了获得一个特定的房间,我编写了以下函数:

Db.prototype.getRoom = function (roomUid){

 return new Promise(function(resolve, reject) {

    firebase.database().ref('rooms/' + roomUid).once('value').then(function(snapshot){
      resolve(snapshot.val());
    })
 });
}
这是我的问题-我需要在返回阵列之前下载所有房间。我试过:

Db.prototype.getUserRooms = function(user){

     var rooms = [];

      firebase.database().ref('users/' + user.uid + '/rooms')
      .once('value').then(function(snapshot){

        var roomsIds = snapshot.val() || []; //array of rooms ids

        for(var i = 0; i < roomsIds.length; i++){
          Db.prototype.getRoom(roomsIds[i]).then(function(room){
            rooms.push(room);
          });
        } 

        return rooms;

      });
 }
Db.prototype.getUserRooms=函数(用户){
var房间=[];
firebase.database().ref('users/'+user.uid+'/rooms'))
.one('value')。然后(函数(快照){
var roomsIds=snapshot.val()| |[];//房间ID数组
对于(变量i=0;i

谢谢你的帮助,你得做几件事才能让这一切顺利进行

首先,当您使用
for
循环检索一组异步值时,必须收集所有承诺并使用
Promise.all()
等待所有这些异步操作完成

其次,当您在
.then()
处理程序中有一个承诺时,您需要从
.then()
处理程序返回该承诺以将其链接在一起

第三,当您想从另一个方法中调用一个方法时,您需要在对象的实例上调用它,而不是直接在原型上调用它

// return the inner promise directly rather than wrap in a new promse
Db.prototype.getRoom = function (roomUid){
    return firebase.database().ref('rooms/' + roomUid).once('value').then(function(snapshot){
      // make the `.val()` result be the fulfilled value of the promise
      return snapshot.val();
    })
 });
}

Db.prototype.getUserRooms = function(user){
     var self = this;
     return firebase.database().ref('users/' + user.uid + '/rooms').once('value').then(function(snapshot){
        var roomsIds = snapshot.val() || []; //array of rooms ids
        return Promise.all(roomsIds.map(function(roomID) {
            return self.getRoom(roomID);
        }));
    });
 }
对于它们,我仍然有点困惑,为什么要直接在原型上调用方法,比如
Db.prototype.getRoom()
。通常,当使用面向对象的Javascript时,您会在
db
对象的实例上调用方法,而不是直接在原型上调用方法。我已经修改了
getUserRooms()
以这种方式工作,在实例上调用
.getrooms()

然后,用法如下所示:

 // assumes mydb is an instance of your Db object

mydb.getUserRooms(someUser).then(function(rooms) {
    // rooms is an array of rooms
    console.log(rooms);
});