如何等待对最内部firebase函数的响应?

如何等待对最内部firebase函数的响应?,firebase,react-native,firebase-realtime-database,google-cloud-functions,Firebase,React Native,Firebase Realtime Database,Google Cloud Functions,我正在使用Firebase函数读取Redux操作中的数据。问题是函数没有等待Firebase函数的响应。您可以在下面看到功能的所有代码。如何设置第二个firebase函数以等待响应 export const getSelectedGroupDetail = groupUid => dispatch => { dispatch({ type: GET_SELECTED_GROUP_DETAIL_START, }); firebase .database()

我正在使用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.');
    });
};
export const getSelectedGroupDetail=groupUid=>dispatch=>{
派遣({
类型:获取\u所选\u组\u详细信息\u开始,
});
火基
.数据库()
.ref('/groups/'+groupUid)
.once('值')
.then(功能(快照){
const membersList=\.map(snapshot.val().members,(val,uid)=>({…val,uid}));
let groupMembersList=\uu0.map(selectedGroupData.members,(val,uid)=>{
返回{…val,uid};
});
for(让index=0;indexconsole.log(e.message));
}
const yeniGrupDetayi={…snapshot.val(),uid:groupUid,membersList};
console.log('ACTION NE YAZDI?==>',yeniGrupDetayi);
派遣({
类型:获取\u所选\u组\u详细信息\u成功,
有效载荷:yeniGrupDetayi,
});
NavigationService.navigate('GroupDetail');
})
.catch(e=>{
派遣({
类型:获取\u所选\u组\u详细信息\u失败,
});
警惕。警惕('Hata'、'Beklenmedik bir Hata meydana geldi');
});
};
如果第二个Firebase函数将等待响应,
memberList
将位于
yeniGrupDetayi
对象内。如果第二个Firebase函数将等待响应,
membersList
将位于
yeniGrupDetayi
对象内。在操作代码的末尾,FlatList正在运行,但我无法在FlatList中看到
成员列表。

您可以提取

firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
这样的函数的行:

async function getMembersListFromDB() {
  return firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
}
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.');
      });
};
现在在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 };
  })
for(让index=0;index
说明:

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

有关async/await的更多信息

您可以提取

firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
这样的函数的行:

async function getMembersListFromDB() {
  return firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
}
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.');
      });
};
现在在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 };
  })
for(让index=0;index
说明:

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


关于async/await的更多信息

您的问题是,您通过循环进行了多个承诺调用,并且在循环后放置了单独的代码。问题是,代码不会等待执行,直到您将其精确化

因此,要么你将电话重新组合成一个单一的承诺,等待所有人响应,要么你这样做:

async function getMembersListFromDB() {
  return firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
}
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.');
      });
};
export const getSelectedGroupDetail=groupUid=>dispatch=>{
派遣({
类型:获取\u所选\u组\u详细信息\u开始,
});
火基
.数据库()
.ref('/groups/'+groupUid)
.once('值')
.then(功能(快照){
const membersList=\.map(snapshot.val().members,(val,uid)=>({…val,uid}));
let groupMembersList=\uu0.map(selectedGroupData.members,(val,uid)=>{
返回{…val,uid};
});
for(让index=0;index',yeniGrupDetayi);
派遣({
类型:获取\u所选\u组\u详细信息\u成功,
有效载荷:yeniGrupDetayi,
});
NavigationService.navigate('GroupDetail');
}
})
.catch(e=>console.log(e.message));
}
})
.catch(e=>{
派遣({
类型:获取\u所选\u组\u详细信息\u失败,
});
警惕。警惕('Hata'、'Beklenmedik bir Hata meydana geldi');
});
};

它有点凌乱,不易维护,但会起到一定的作用。

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

因此,要么你将电话重新组合成一个单一的承诺,等待所有人响应,要么你这样做:

async function getMembersListFromDB() {
  return firebase.database().ref('/users/' + groupMembersList[index].uid).once('value')
}
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.');
      });
};
export const getSelectedGroupDetail=groupUid=>dispatch=>{
派遣({
类型:获取\u所选\u组\u详细信息\u开始,
});
火基
.数据库()
.ref('/groups/'+groupUid)
.once('值')
.then(功能(快照){
康斯特成员