Я хотел бы понять, почему следующий код вызовет эту ошибку?

TypeError отписаться не функция

У меня нет такой ошибки, когда я использовал .onSnapshot() функцию вместо get().

Спасибо

  useEffect(() => {
    const unsubscribe = database
      .collection("Maps")
      .doc(id)
      .collection("Entries")
      .get()
      .then(
        data => {
          data.forEach(doc => {
            console.log(doc.id, " => ", doc.data());
          });
          setLoading(false);
        },
        err => {
          setError(err);
          console.log(err);
        }
      );
    return () => unsubscribe();
  }, [id]);
0
innek 26 Апр 2020 в 00:47

2 ответа

Лучший ответ

Вы не можете отписаться от get() звонка. Из-за этого get() не возвращает метод отмены подписки, и ваш вызов не удался.


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

Когда вы вызываете get() для загрузки данных, клиент получает данные с сервера один раз, а затем немедленно прекращает прослушивание изменений. Вот почему нет необходимости отписываться (или нет возможности прекратить подписку) после того, как вы позвоните get().


Если есть вероятность, что загрузка данных может занять больше времени, чем смонтированный компонент, вам нужно проверить размонтирование компонента внутри обработчика then(). Пример этого см. В Is Есть ли способ проверить, отключен ли компонент реагирования?

1
Frank van Puffelen 25 Апр 2020 в 21:52

Unsubscribe () не является функцией, потому что то, что возвращается из базы данных, не является функцией. Вызов функции в обмен на очистку. Иметь функцию, которая делает уборку и вызывать ее.

0
tksilicon 25 Апр 2020 в 21:51