ため
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;
});
}
感謝を。
最初に、for
ループを使用して一連の非同期値を取得する場合は、すべての約束を収集し、Promise.all()
を使用してすべての非同期操作が完了するまで待つ必要があります。
第二に、あなたは.then()
ハンドラの内部の約束を持っているとき、あなたは一緒にチェーンに.then()
ハンドラからそれをその約束を返却する必要があります。
第3に、別のメソッドからメソッドを呼び出す場合は、プロトタイプに直接ではなくオブジェクトのインスタンスで呼び出す必要があります。
// 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);
});
私の問題のようにきれいな解決策:
その後、使い方は次のようになります。ありがとうございました –