javascript - Firebase:如何在 React Native 中异步更新记录的值?

标签 javascript firebase react-native firebase-realtime-database async-await

我正在寻找一种解决方案来更新 firebase 数据库中的部分记录,最终我发现我需要该记录的 uid。所以我首先有一个查询来检索 uid,然后执行更新。问题是,由于第一个查询是异步的,因此第二个控制台日志首先执行,因此第一次运行时的 uid 值为 null。如何编辑代码以便首先获取 uid,然后根据第一个查询的结果执行更新操作?这是我的代码:

export const cupChanged = ({cup}) => {
  const {currentUser} = firebase.auth();
  let userSettingsUid = null;
  firebase
    .database()
    .ref(`/users/${currentUser.uid}/settings`)
    .on('value', snapshot => {
      if (snapshot.val() != null) {
        const userSettings = _.map(snapshot.val(), (val, uid) => {
          return {...val, uid};
        });
        userSettingsUid = userSettings[0].uid;
        console.log('First stage is : ' + userSettingsUid);
      }
    });
  return dispatch => {
    console.log('Second stage is : ' + userSettingsUid);
    firebase
      .database()
      .ref(`/users/${currentUser.uid}/settings/${userSettingsUid}`)
      .update({
        cup,
      })
      .then(() => {
        dispatch({
          type: CUP_CHANGED,
          payload: cup,
        });
      });
  };
};

最佳答案

通过使用once()方法“监听指定事件类型的一个事件”并返回一个 Promise,该 Promise 解析为 DataSnapshot ,您将能够链接不同的 Promise,如下所示:

  export const cupChanged = ({ cup }) => {
    const { currentUser } = firebase.auth();
    let userSettingsUid = null;

    return firebase
      .database()
      .ref(`/users/${currentUser.uid}/settings`)
      .once('value')
      .then(snapshot => {
        if (snapshot.val() != null) {
          const userSettings = _.map(snapshot.val(), (val, uid) => {
            return { ...val, uid };
          });
          userSettingsUid = userSettings[0].uid;
          console.log('First stage is : ' + userSettingsUid);
          return firebase
            .database()
            .ref(`/users/${currentUser.uid}/settings/${userSettingsUid}`)
            .update({
              cup
            });
        } else {
          throw new Error('Snapshot is null');
        }
      })
      .then(() => {
        dispatch({
          type: CUP_CHANGED,
          payload: cup
        });
      })
      .catch(err => {
        //....
        //return .... 
      });
  };

关于javascript - Firebase:如何在 React Native 中异步更新记录的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59334483/

相关文章:

javascript - 为什么我的内联样式 CSS 不起作用

javascript - firebase 在删除之前获取父数据的父数据

java - FirebaseRecyclerAdapter 中的数据库查询

javascript - react native 平面列表,从状态中删除元素时无法正确更新

react-native - react native : Cannot add a child that doesn't have a YogaNode or parent node

javascript - 将 "no results"添加到搜索/过滤脚本中

javascript - 在 framer 滚动组件上监听滚动

javascript - Grunt postcss 任务排除文件

ios - 检查用户是否登录 Facebook 并更改 View Controller

ios - 无法删除 NavigatorIOS 右键单击​​操作上的 Realm 对象