Реактивная исходная база push-снимков Firebase для массива - PullRequest
0 голосов
/ 09 сентября 2018

Я хочу перенести снимок, который я получаю из базы Firebase, в массив, чтобы я мог отобразить его, как-то объекты продолжают переопределять массив вместо добавления к самому массиву!

вот моя функция

  _getMessages = async () => {

    await firebase.database().ref('User-Message').child(this.state.fromUser).child(this.state.toUser).on('child_added', async (snapshot) => {

      let message_array = [];

      let message_id = await snapshot.key;

      let message_ref = await firebase.database().ref('Message').child(message_id).once('value', async (payload) => {

        await message_array.push(payload.val())

      })

      console.log(message_array);

    })

  }

продолжает регистрироваться так

[{
    toId : 'id',
    text : 'message',
    fromId : 'id',
    time : timestamp
}]
[{
    toId : 'id',
    text : 'message',
    fromId : 'id',
    time : timestamp
}]
[{
    toId : 'id',
    text : 'message',
    fromId : 'id',
    time : timestamp
}]
[{
    toId : 'id',
    text : 'message',
    fromId : 'id',
    time : timestamp
}]

я хочу, чтобы он был в одном массиве, чтобы я мог отображать его

как мне этого достичь?

Ответы [ 4 ]

0 голосов
/ 09 сентября 2018

Я согласен с ответом Виктора.

_getMessages = async () => {

     await firebase.database().ref('User-Message').child(this.state.fromUser).child(this.state.toUser).on('child_added', async (snapshot) => {

           let message_array = []; // Why is the array initialized everytime on add?

           let message_id = await snapshot.key;    
           let message_ref = await  firebase.database().ref('Message').child(message_id).once('value', async (payload) => {    
              await message_array.push(payload.val())
           }) 

           console.log(message_array);
        })
}
0 голосов
/ 09 сентября 2018
_getMessages = () => {
    let message_array = [];
    var isLoaded = false;
    var self = {
        onArrayChanged: () => {
            console.log(message_array);
        },
        currentArray: () => {
            return message_array;
        },
        load: ()=>{
            if(isLoaded)
                return Promise.resolve();
            return new Promise((res,rej)=>{
                firebase.database().ref('User-Message').child(this.state.fromUser).child(this.state.toUser).on('child_added', (snapshot) => {
                    let message_id = snapshot.key;
                    var promiseArray = [];
                    promiseArray.push(new Promise(res1,rej1)=>{
                        firebase.database().ref('Message').child(message_id).once('value', (payload) => {
                            message_array.push(payload.val());
                            if(isLoaded)
                                self.onArrayChanged();
                            else
                                res1();
                        });
                    });
                    Promise.all(promiseArray).then(()=>{
                        isLoaded = true; 
                        res();
                    }).catch(rej);
                });
            });
        }
    };
    return self;
  }

    // Usage

    var messages = _getMessages();
    try{
        await messages.load();
        console.log("loaded");
        console.log(messages.currentArray);
    }catch(e){

    }
0 голосов
/ 09 сентября 2018
firebase.database().ref('Message').once('value') 
  .then((snapshot) => {
    const message_array= [];

     snapshot.forEach((childSnapshot) => {
       message_array.push({
        id: childSnapshot.key,
         ...childSnapshot.val()
       });
     });
0 голосов
/ 09 сентября 2018

Просто поместите ваш массив сообщений за пределы прослушивателя событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...