[英]How to read data from Firebase Real Time database with React Native?
[英]Firebase Real Time Database read data
我正在使用 React + Redux 和 Firebase 的实时数据库构建类似 Messenger 的东西。
我习惯于从这样的 API 中检索数据:
export const fetchContacts = () => {
return async dispatch => {
dispatch(fetchContactsStart());
try {
const response = await axios.get('....');
dispatch(fetchContactsSuccess(...));
} catch(e) {
dispatch(fetchContactsFail(...));
}
}
}
现在在firebase中我有以下数据:在此处输入图像描述
我需要的是获取所有用户联系人,然后获取与这些联系人关联的用户信息并构建一个结构,如:[{email: ..., username: ...}, {email: ..., username: .. .}, ...]。 以该格式获取所有数据后,我想将操作分派给我的减速器。
现在我有以下代码:
export const fetchContacts = () => {
return dispatch => {
dispatch(fetchContactsStart());
const userEmail = firebase.auth().currentUser.email;
let data = [];
firebase.database().ref(`users_contacts/${Base64.encode(userEmail)}`)
.on('value', contacts => contacts.forEach(contact => {
firebase.database().ref(`users/${Base64.encode(contact.val().contact)}`)
.on('value', user => {
data.push({ email: contact.val().contact, username: user.val().username });
console.log(data)
})
}
))
}
}
这有效,但我不知道如何仅在数据完全形成时才调度操作,有什么解决方案吗? 谢谢您的帮助!
当您等待多个异步操作完成时,解决方案通常是使用Promise.all
。 在这种情况下,它看起来像这样:
export const fetchContacts = () => {
return dispatch => {
dispatch(fetchContactsStart());
const userEmail = firebase.auth().currentUser.email;
let data = [];
firebase.database().ref(`users_contacts/${Base64.encode(userEmail)}`).once('value', contacts => {
let promises = [];
let map = {};
contacts.forEach(contact => {
const contactId = Base64.encode(contact.val().contact);
map[contactId] = contact.val().contact;
promises.push(firebase.database().ref(`users/${contactId}`).once('value'));
});
Promise.all(promises).then((users) => {
users.forEach((user) =>
data.push({ email: map[user.key], username: user.val().username });
})
// TODO: dispatch the result here
}
))
}
}
这里的主要变化:
once()
来加载用户数据,所以它只加载一次并返回一个承诺。Promise.all
等待所有配置文件加载Promise.all
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.