useEffect() и Google Firebase onAuthStateChange

# #reactjs #firebase #google-cloud-firestore #firebase-authentication #react-hooks

Вопрос:

Всякий раз, когда компонент монтируется, будет вызываться onAuthStateChange(setCurrentUser), в котором передается функция для установки состояния текущего пользователя. Затем Firebase возвращает объект аутентификации в зависимости от того, вошел ли пользователь, который я использую для установки состояния текущего пользователя, а также сохранения данных в firestore с помощью createUserDocument().

Что делает авт.Возврат onAuthStateChanged(асинхронный пользователь ….)? Я в замешательстве, так как его возвращаемое значение назначается для отмены подписки, которая вызывается всякий раз, когда компонент отключается.

 function onAuthStateChange(callback) {
  return auth.onAuthStateChanged(async userAuth => {
    if (userAuth) {
      const userRef = await createUserDocument(userAuth); 
      userRef.onSnapshot(snapShot => {
        callback({
          id: snapShot.id, 
          ...snapShot.data()
        })
      })
    } else {
      callback(null); 
    }
  })
}

function App() {
  const [currentUser, setCurrentUser] = useState(null); 
  useEffect(() => {
      const unsubscribe = onAuthStateChange(setCurrentUser); 
      return () => {
        unsubscribe(); 
      }; 
  }, [])
 

Ответ №1:

Согласно документации onAuthStateChanged возвращается firebase.Unsubscribe . Когда вы вызываете эту функцию, Firebase гарантирует, что этот запрос будет удален из наблюдаемых объектов (поэтому firebase не уведомляет ваш компонент, которого больше нет, и это предотвращает ошибки, утечки памяти или потерю вычислительной мощности).

Наблюдаемые объекты реализованы внутри Firebase, и именно так они решают, кто запрашивал уведомление при изменении определенного состояния.