主要目标:在注销用户之前正确退订所有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似乎被包装在了一些调度调用中,我现在不明白它的行为。
有人有什么解决办法吗?
答案 0 :(得分:0)
Ok在Reactiflux上的@ioss的帮助下解决了它。 由于某些奇怪的原因,componentDidMount被挂载了两次,创建了多个侦听器,因此仅卸载一个侦听器是不够的。 通过在componentWillUnmount()中的unsubscribe()上添加另一个运行来解决该问题。