1

I am implementing chat feature in my project and for that have used chat library and as a database for a chat, I am using Firebase Real-time Database. There are two methods: One is getMessageHistory() [Which is used to get the message history of users message] and another one is getMessageHistoryFromFirebase() [Which is used to get the message history of users message from FIREBASE real-time database]

PROBLEM: When I am calling getMessageHistoryFromFirebase() method in getMessageHistory() it gets called and but called late and the current execution of parent method is reached to an end.

How do I get data from firebase (by getMessageHistoryFromFirebase() method) and then fill the mockedHistory array with firebase database? Even I know the method get called early and at the time of initialization the current list is empty:

Every response will be highly appreciated!

Class file :

Parent Method :

    getMessageHistory(userId: any): Observable<Message[]> {
    let firebaseMessages = this.getMessageHistoryFromFirebase(userId);

    let mockedHistory: Array<Message>;

    mockedHistory = firebaseMessages;

    // mockedHistory = [
    //     {
    //         fromId: userId,
    //         toId: userId,
    //         message: "Hi there, just type any message bellow to test this Angular module."
    //     }
    // ];

    return Observable.of(mockedHistory);
}

Child Method :

getMessageHistoryFromFirebase(farmerId) : any{
    let chatMessages  = [];
    var chats;

    var database = firebase.database();
    firebase.database()
    .ref('/' + this.chatUrl + '/' + farmerId + '/')
    .once('value', function (snapshot) {
    chats = snapshot.val();
    if (chats != null) {
    Object.keys(chats).forEach(element => {
      let chat = chats[element.toString()];

      var Message = {
        fromId : chat.from,
        toId:chat.to,
        message: chat.message
      }

      chatMessages.push(Message)
    });

  }
 });
return chatMessages;
}

It works fine if I added some element in the list in with the help of for loop but not with promise.

Prashant Pimpale
  • 10,349
  • 9
  • 44
  • 84

0 Answers0