如何在我转到另一个屏幕时停止Firebase Listener



我正在使用Firebase Listener on Redux操作中获取屏幕中的数据。这是我下面的 redux 操作代码:

export const getSelectedProjectDetail = (groupUid, projectUid) => dispatch => {
  dispatch({
    type: GET_SELECTED_PROJECT_DETAIL_START,
  });
  firebase.database().ref('/groups/' + groupUid + '/projects/' + projectUid).on('value', (mainSnap) => {
    firebase
    .database()
    .ref('/users/' + mainSnap.val().creator.uid)
    .on('value', snapshot => {
      const messagesList = _.map(mainSnap.val().messages, (val, uid) => ({ ...val, uid }));
      for (let index = 0; index < messagesList.length; index++) {
        // eslint-disable-next-line no-loop-func
        firebase.database().ref('/users/' + messagesList[index].author.uid).on('value', function (childSnapshot) {
          messagesList[index] = {
            ...messagesList[index],
            author: {
              ...messagesList[index].author,
              name: childSnapshot.val().displayName,
              email: childSnapshot.val().email,
            },
          };
          if (index === messagesList.length - 1) {
            const selectedProjectDetail = {
              ...mainSnap.val(),
              creator: { ...mainSnap.val().creator, name: snapshot.val().displayName },
              messages: _.reverse(messagesList),
            };
            dispatch({
              type: GET_SELECTED_PROJECT_DETAIL_SUCCESS,
              payload: selectedProjectDetail,
            });
            NavigationService.navigate('ProjectDetail');
          }
        });
      }
    });
  });
};

问题是,当我在另一个屏幕上时我的数据库中发生了变化时,屏幕会传递给带有侦听器的屏幕。我想,当我关闭屏幕时,我需要停止听众。如何使用 Firebase 功能或任何功能阻止它们?

如果你在 redux 中添加侦听器,就像

const myRef = '/users/' + messagesList[index].author.uid

firebase.database().ref(myRef).on('value',
  function (childSnapshot) {
      messagesList[index] = {
          ...messagesList[index],
             author: {
             ...messagesList[index].author,
             name: childSnapshot.val().displayName,
             email: childSnapshot.val().email,
            },
        };

您需要将该myRef保存在 redux 存储中

在组件

卸载时,在组件将卸载您可以调度另一个操作,然后您可以通过以下方式删除侦听器 firebase.database().ref('myRef').off('value', callback)届时,您可以从 Redux 存储中获取myRef变量

最新更新