【问题标题】:How to wait the response to the innermost firebase function?如何等待最里面的firebase函数的响应?
【发布时间】:2019-10-07 12:36:20
【问题描述】:

我正在使用 Firebase 函数来读取 Redux 操作中的数据。问题是该函数没有等待 Firebase 函数的响应。您可以在下面看到所有功能代码。如何设置第二个 firebase 函数等待响应?

export const getSelectedGroupDetail = groupUid => dispatch => {
  dispatch({
    type: GET_SELECTED_GROUP_DETAIL_START,
  });
  firebase
    .database()
    .ref('/groups/' + groupUid)
    .once('value')
    .then(function (snapshot) {
      const membersList = _.map(snapshot.val().members, (val, uid) => ({ ...val, uid }));

      let groupMembersList = _.map(selectedGroupData.members, (val, uid) => {
    return { ...val, uid };
  });
      for (let index = 0; index < groupMembersList.length; index++) {
        firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
          .then(function (snapshot) {
            let name = snapshot.val().displayName;
            groupMembersList[index] = { ...groupMembersList[index], name };
          })
    .catch(e => console.log(e.message));
      }

      const yeniGrupDetayi = { ...snapshot.val(), uid: groupUid, membersList };
      console.log('ACTION NE YAZDI ? ===>', yeniGrupDetayi);
      dispatch({
        type: GET_SELECTED_GROUP_DETAIL_SUCCESS,
        payload: yeniGrupDetayi,
      });
      NavigationService.navigate('GroupDetail');
    })
    .catch(e => {
      dispatch({
        type: GET_SELECTED_GROUP_DETAIL_FAIL,
      });
      Alert.alert('Hata', 'Beklenmedik bir hata meydana geldi.');
    });
};

如果第二个 Firebase 函数将等待响应,memberList 将在 yeniGrupDetayi 对象内。如果第二个 Firebase 函数将等待响应,membersList 将在 yeniGrupDetayi 对象内。在操作代码的最后,FlatList 正在运行,但我在 FlatList 中看不到membersList

【问题讨论】:

  • 你想让你的程序等待firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')行执行吗?
  • @AsimHashmi 是的先生。
  • 只需将您的代码放在您正在等待的 firebase 调用的 .then() 中
  • 看了很久才发现一个问题。 Array 中的某些对象不使用“name”键。第一个奇怪的数据是名称,接下来的5个数据丢失了,然后又出现了。全都一样。您可以在链接上的照片中看到问题。什么原因? ibb.co/SJvBhb6ibb.co/jvDFq2k

标签: firebase react-native firebase-realtime-database google-cloud-functions


【解决方案1】:

您的问题是您通过循环调用了多个 Promise,并且在循环之后放置了单独的代码。问题是,代码不会等到您精确后才执行。

因此,要么您将调用重新组合在一个 promise 中并等待所有调用响应,要么执行以下操作:

export const getSelectedGroupDetail = groupUid => dispatch => {
      dispatch({
        type: GET_SELECTED_GROUP_DETAIL_START,
      });
  firebase
      .database()
      .ref('/groups/' + groupUid)
      .once('value')
      .then(function (snapshot) {
        const membersList = _.map(snapshot.val().members, (val, uid) => ({ ...val, uid }));

        let groupMembersList = _.map(selectedGroupData.members, (val, uid) => {
          return { ...val, uid };
        });
        for (let index = 0; index < groupMembersList.length; index++) {
          firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
              .then(function (childSnapshot) {
                let name = childSnapshot.val().displayName;
                groupMembersList[index] = { ...groupMembersList[index], name };

                if(index === groupMembersList.length -1)
                {
                  const yeniGrupDetayi = { ...snapshot.val(), uid: groupUid, membersList };
                  console.log('ACTION NE YAZDI ? ===>', yeniGrupDetayi);
                  dispatch({
                    type: GET_SELECTED_GROUP_DETAIL_SUCCESS,
                    payload: yeniGrupDetayi,
                  });
                  NavigationService.navigate('GroupDetail');
                }
              })
              .catch(e => console.log(e.message));
        }
      })
      .catch(e => {
        dispatch({
          type: GET_SELECTED_GROUP_DETAIL_FAIL,
        });
        Alert.alert('Hata', 'Beklenmedik bir hata meydana geldi.');
      });
};

它有点凌乱且不易维护,但可以解决问题

【讨论】:

  • 看了很久才发现一个问题。 Array 中的某些对象不使用“name”键。第一个奇怪的数据是名称,接下来的5个数据丢失了,然后又出现了。全都一样。您可以在链接上的照片中看到问题。什么原因?屏幕 SS - ibb.co/SJvBhb6 |调试 SS - ibb.co/jvDFq2k
  • 您确定名称已正确存储在 firebase 中吗?
【解决方案2】:

你可以提取你的

firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')

到这样的函数:

async function getMembersListFromDB() {
  return firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
}

现在在你的 for 循环中:

for (let index = 0; index < groupMembersList.length; index++) {
  await this.getMembersListFromDB().then(function (snapshot) {
    let name = snapshot.val().displayName;
    groupMembersList[index] = { ...groupMembersList[index], name };
  })

说明:

您可以使用aysncawait 的组合来暂停程序的执行,直到Promise 解决。 await 关键字将告诉程序等待数据库查询执行,然后程序将继续执行

更多关于异步/等待here

【讨论】:

  • 先生,非常感谢您的努力。但是,程序给出了一个错误,即“你不能在异步函数之外使用'await'关键字”。你能编辑你的帖子吗?另外,你能编辑我的全部代码吗?
  • 你为什么使用异步? firebase 功能已经是承诺。就像使用 promise 一样使用 .then().catch
  • 你好勤奋的人,你是对的,但我应该如何编辑我的代码?你能支持我吗?
猜你喜欢
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2019-10-20
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多