2017-02-15 3 views
2

私はすべての部屋特定のユーザーのを返す機能を達成しようとしています。私はfirebaseで働いていると私は、この関数を書いた特定の部屋を得るために:非同期読み込みDB返却コレクション

Db.prototype.getRoom = function (roomUid){ 

return new Promise(function(resolve, reject) { 

    firebase.database().ref('rooms/' + roomUid).once('value').then(function(snapshot){ 
     resolve(snapshot.val()); 
    }) 
}); 
} 

ここに私の問題がある - 私は、配列を返す前に、すべての部屋をダウンロードする必要があります。私が試した:あなたはこの仕事をするためにカップルの事をしなければならない任意の助け

答えて

2

ため

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); 
}); 
+0

私の問題のようにきれいな解決策:

その後、使い方は次のようになります。ありがとうございました –

関連する問題