Основная цель: правильно отписаться от всех слушателей firestore перед выходом из системы, предотвращая утечки.
Вовлеченные библиотеки: реагируют, реагируют на нативные, редуксы, редуксы-thunk и реагируют на нативную базу огня. .
Проблема: Отказаться от подписки на firestore (...). OnSnapshot () не работает, когда задействована dispatch ().
Я получаю данные с onSnapshot и возвращает функцию отмены подписки компоненту вызывающей стороны, который я вызываю при выходе пользователя из системы. Как ни странно, UNSUBSCRIBE работает только тогда, когда не выполняется диспетчеризация ...
У меня есть компонент (component. js), который подключен к хранилищу резервных копий и постоянно извлекает некоторые пользовательские данные, такие как: *
В действиях. 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 в предыдущем создателе действия.
Если я вызываю функцию unsubscribe в компоненте. 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);
});
};
Теперь, если я хочу отправить полученные данные в резервное хранилище с отправкой, я добавляю отправку следующим образом в действиях. 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;
};
};
Но вдруг в моем компоненте. js, this.unsubscribe больше не работает при выходе из системы.
Я обнаружил, что этот парень делает то же самое, но работает на его на Реакте: здесь . Решение, предоставленное этим другим парнем, в основном тоже такое же .
Похоже, что firestore-onsnapshot-listener обернут в некоторый диспетчерский вызов из-за redux-thunk, и я не могу понять, как он себя сейчас ведет.
Есть ли у кого-нибудь решение?