Можно ли отказаться от подписки на слушателя при его обратном вызове?

#javascript #reactjs #callback #next.js #redux-thunk

#javascript #reactjs #обратный вызов #next.js #redux-thunk

Вопрос:

У меня есть следующий фрагмент, который касается потока аутентификации для веб-приложения, над которым я работаю. Он устанавливает информацию об аутентификации пользователя в состояние Redux. Прослушиватель onAuthStateChanged возвращает функцию отмены подписки, и мне нужно вызвать ее в какой-то момент, чтобы предотвратить утечку памяти. В приведенном ниже коде я вызываю функцию отмены подписки из функции обратного вызова onAuthStateChanged . Можно ли это сделать? В общем, можно ли отказаться от подписки на слушателя в его обратном вызове?

 export const frontEndAuthCheck = () => async dispatch => { 
  dispatch({
    type: actions.AUTH_CHECK_RESET_FRONT_END,
  });
  dispatch({
    type: actions.SET_TO_LOGGED_OUT_FRONT_END,
  });
  dispatch({
    type: actions.AUTH_CHECK_STARTED_FRONT_END,
  });

  let unsubscribeFunction;
  unsubscribeFunction = firebase.auth().onAuthStateChanged( (user) => {
    if (user) {
      dispatch({
        type: actions.SET_TO_LOGGED_IN_FRONT_END,
      });
      dispatch({
        type: actions.AUTH_CHECK_COMPLETE_FRONT_END,
      });
    }
    else {
      dispatch({
        type: actions.AUTH_CHECK_COMPLETE_FRONT_END,
      });    
    }
    if (unsubscribeFunction) unsubscribeFunction();
  });
}
 

Комментарии:

1. Я полагаю, что альтернативой является сохранение этого обратного вызова отмены подписки в состоянии где-нибудь, чтобы быть вызванным кодом позже, когда вы захотите отказаться от подписки. Или реорганизовать его, чтобы поместить логику firebase в поставщик контекста React, подключенный к redux. Есть ли проблема с приведенным выше кодом или вы скорее ищете обзор кода ?

2. Я немного новичок во всем этом и просто пытаюсь концептуально понять, можно ли отказаться от подписки на слушателя в его обратном вызове? Мне неясно, вызовет ли это какие-либо проблемы.

3. Концептуально я считаю, что это должно работать изолированно. Теперь сложнее сказать, работает ли это в более масштабной схеме вашего приложения, не видя, как оно работает в браузере или в ходе интеграционного тестирования.

4. Спасибо — оцените цвет.