取消订阅firestore(...)。当涉及dispatch()时,onSnapshot()不起作用

时间:2020-04-14 23:06:06

标签: reactjs react-native react-redux redux-thunk react-native-firebase

主要目标:在注销用户之前正确退订所有Firestore-Listener,以防止泄漏。

涉及的库:react,react-native,redux,redux-thunk和react-native-firebase。

问题:取消订阅firestore(...)。当涉及dispatch()时,onSnapshot()不起作用。

我使用onSnapshot获取数据,并将取消订阅功能返回给我在用户注销时调用的调用方组件。奇怪的是,UNSUBSCRIBE仅在不产生任何障碍时才起作用...

我有一个连接到redux存储的组件(component.js),并不断获取一些用户数据,如下所示:

componentDidMount() {
  this.unsubscribe = this.props.userFetch(); // userFetch is an action creator in actions.js
}

在actions.js

import firestore from '@react-native-firebase/firestore';
import auth from '@react-native-firebase/auth';

export const userFetch = () => {
  return dispatch => {
    const unsubscribe = firestore()
      .doc(`users/${auth().currentUser.uid}`)
      .onSnapshot({
        error: e => console.warn('ERROR IN FETCH: ', e),
        next: SnapshotUser => {
          console.log('User: ', SnapshotUser.data());
          // Will dispatch action below
        },
      });
    return unsubscribe;
  };
};

请注意,先前的动作创建者目前没有DISPATCH。

如果我在component.js中调用取消订阅,则Firestore onSnapshot侦听器将被正确取消订阅,如下所示:

onLogoutPressed = () => {
  this.unsubscribe(); // <-- HERE it works (for the moment...)
  auth()
    .signOut()
    .then(() => {
      console.log('user has been signout');
    })
    .catch(error => {
      console.log('Error: ',error);
    });
};

现在,如果我想使用分派将获取的数据发送到redux存储,则可以在action.js中添加这样的分派

export const userFetch = () => {
  return dispatch => {
    const unsubscribe = firestore()
      .doc(`users/${auth().currentUser.uid}`)
      .onSnapshot({
        error: e => console.warn('ERROR IN FETCH: ', e),
        next: SnapshotUser => {
          console.log('User: ', SnapshotUser.data());
          // Will dispatch action below
          dispatch({   // <--------------------------------- HERE
            type: 'USER_FETCH_SUCCESS',
            payload: SnapshotUser.data(),
          });
        },
      });
    return unsubscribe;
  };
};

但是突然在我的component.js中,this.unsubscribe在注销时不再起作用。

我发现那个人也这样做,但是在React:here上为他工作。 该其他人提供的解决方案基本上也就是same

由于redux-thunk的原因,firestore-onsnapshot-listener似乎被包装在了一些调度调用中,我现在不明白它的行为。

有人有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

Ok在Reactiflux上的@ioss的帮助下解决了它。 由于某些奇怪的原因,componentDidMount被挂载了两次,创建了多个侦听器,因此仅卸载一个侦听器是不够的。 通过在componentWillUnmount()中的unsubscribe()上添加另一个运行来解决该问题。