[英]react-native firebase push snapshots to array
I want to push snapshot i get from firebase to an array so i can map through it, somehow the objects keeps overriding the array instead of appending to the array itself ! 我想将我从firebase获得的快照推送到数组,以便我可以通过它进行映射,以某种方式,对象始终覆盖该数组,而不是附加到数组本身!
here is my function 这是我的功能
_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);
})
}
it keeps logging like this 它一直这样记录
[{
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
}]
i want it to be in one array so i can map through it 我希望它在一个数组中,以便我可以通过它映射
how may i achieve that ? 我该如何实现?
只需将您的消息数组放在事件侦听器之外。
_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()
});
});
I agree with Victor's reply. 我同意维克多的答复。
_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);
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.