我想将快照从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
}]
我希望它在一个数组中,所以我可以通过它进行映射
我怎么可能实现这一目标?
只需将您的消息数组放在事件侦听器之外。
_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){
}
firebase.database().ref('Message').once('value')
.then((snapshot) => {
const message_array= [];
snapshot.forEach((childSnapshot) => {
message_array.push({
id: childSnapshot.key,
...childSnapshot.val()
});
});
我同意Victor的回复。
_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);
})
}