Как ждать ответа на самую внутреннюю функцию firebase? - PullRequest
0 голосов
/ 21 мая 2019

Я использую функцию 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.');
    });
};

Если 2-я функция Firebase будет ожидать ответа, memberList будет находиться внутри yeniGrupDetayi объекта.Если 2-я функция Firebase будет ждать ответа, membersList будет внутри yeniGrupDetayi объекта.В конце кода действия FlatList работает, но я не смог увидеть membersList в FlatList.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Ваша проблема в том, что вы делаете многообещающий вызов через ваш цикл, и вы помещаете отдельный код после вашего цикла.Проблема в том, что код не ждет выполнения, пока вы его не уточните.

Таким образом, либо вы перегруппируете свои звонки в одном обещании и ждете, пока все они ответят, либо вы делаете что-то вроде этого:

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.');
      });
};

Это немного грязно и не очень легко обслуживается.но добьется цели

0 голосов
/ 21 мая 2019

Вы можете извлечь свою строку

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 };
  })

Пояснение:

Вы можете использовать aysnc с комбинацией await, чтобы приостановить выполнение программы, пока Promise не будет решено.Ключевое слово await сообщит программе, что она должна дождаться выполнения запроса к базе данных, и затем программа продолжит выполнение

Подробнее об асинхронном / await здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...