Firebase实时数据库读取数据

菲利普

我正在使用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。
  • 用于Promise.all等待加载所有配置文件。
  • 添加了一个地图以在内部回调中查找电子邮件地址。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Firebase实时数据库读取特定数据

来自分类Dev

如何从Firebase实时数据库读取数据

来自分类Dev

Firebase可调用函数读取实时数据库

来自分类Dev

firebase 实时数据库读取速度较松

来自分类Dev

Firebase实时数据库addValueEventListener

来自分类Dev

Firebase实时数据库-规则

来自分类Dev

Firebase实时数据库addValueEventListener

来自分类Dev

Android:Firebase实时数据库

来自分类Dev

Firebase 实时数据库的问题

来自分类Dev

Firebase 实时数据库帖子

来自分类Dev

从Firebase实时数据库读取数据并使用Angular显示为列表

来自分类Dev

Firebase 实时数据库读取所有现有数据

来自分类Dev

如何从 firebase 实时数据库读取和返回数据?

来自分类Dev

实时数据库

来自分类Dev

如何从Firebase中的实时数据库获取数据

来自分类Dev

更改Firebase实时数据库数据位置

来自分类Dev

从 Firebase 实时数据库中检索子数据

来自分类Dev

Android Firebase 实时数据库获取数据太慢

来自分类Dev

如何从firebase实时数据库中选择数据

来自分类Dev

Firebase 实时数据库中的数据插入无限

来自分类Dev

显示来自 Firebase 实时数据库的数据

来自分类Dev

Firebase 实时数据库,从键值对中获取数据

来自分类Dev

从 Firebase 实时数据库流式传输数据

来自分类Dev

Firebase 实时数据库读写数据协议与android

来自分类Dev

如何获取firebase实时数据库的数据

来自分类Dev

无法从 Firebase 实时数据库获取数据

来自分类Dev

无法从 Firebase 实时数据库中检索数据

来自分类Dev

使用IOS-Swift读取Firebase实时数据库子节点

来自分类Dev

在Firebase实时数据库上进行公共读取访问是否安全?

Related 相关文章

热门标签

归档