2017-02-15 93 views
2

我試着實現將返回所有客房特定用戶的功能。我與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; 

     }); 
} 

感謝所有幫助

回答

2

你要做的幾件事情,使這項工作。

首先,當你使用一個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()以這種方式工作,在實例上調用.getRoom()

然後,用法是這樣的:

// assumes mydb is an instance of your Db object 

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

這樣我的問題的一個乾淨的解決方案。謝謝 –