Отменить подписку на firestore (...). OnSnapshot () не работает, когда задействована dispatch () - PullRequest
0 голосов
/ 15 апреля 2020

Основная цель: правильно отписаться от всех слушателей 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, и я не могу понять, как он себя сейчас ведет.

Есть ли у кого-нибудь решение?

1 Ответ

0 голосов
/ 16 апреля 2020

Ок решил это с помощью @ioss на Reactiflux. ComponentDidMount был смонтирован дважды по некоторым странным причинам, создавая несколько слушателей, поэтому отключение одного было недостаточно. Решил это, добавив еще один запуск по unsubscribe () в componentWillUnmount ().

...