Использование useEffect с асинхронностью?

Я использую этот код:

useFocusEffect(
  useCallback(async () => {
    const user = JSON.parse(await AsyncStorage.getItem("user"));

    if (user.uid) {
      const dbRef = ref(dbDatabase, "/activity/" + user.uid);

      onValue(query(dbRef, limitToLast(20)), (snapshot) => {
        console.info(snapshot.val());
      });

      return () => {
        off(dbRef);
      };
    }
  }, [])
);

Я получаю эту ошибку:

An effect function must not return anything besides a function, which is used for clean-up. It looks like you wrote 'useFocusEffect(async () => ...)' or returned a Promise. Instead, write the async function inside your effect and call it immediately.

Я пытался поместить все в функцию async, но тогда off() не вызывается.

Вы не используете useEffect в этом коде.

Quentin 08.05.2022 13:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

useEffect(() => {
const myFunction = async () => {
your code 
}
myFunction()
}, [])
Ответ принят как подходящий

Определите переменную dbRef вне вложенной функции async, чтобы ваш обратный вызов очистки мог ссылаться на нее, и допускайте возможность, что она может не быть установлена ​​на момент очистки.

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

Кроме того, поскольку компонент может быть размонтирован во время await, вы должны быть уверены, что функция async не продолжит свою логику, когда мы знаем, что очистка не произойдет (потому что она уже произошла), поэтому вам может понадобиться флаг для это (didCleanup внизу).

Что-то вроде этого:

useFocusEffect(
    useCallback(() => {
        let dbRef;
        let didCleanup = false;
        (async() => {
            try {
                const user = JSON.parse(await AsyncStorage.getItem("user"));

                if (!didCleanup && user.uid) {
                    dbRef = ref(dbDatabase, "/activity/" + user.uid);

                    onValue(query(dbRef, limitToLast(20)), (snapshot) => {
                        console.info(snapshot.val());
                    });
                }
            } catch (error) {
                // ...handle/report the error...
            }
        })();
        return () => {
            didCleanup = true;
            if (dbRef) {
                off(dbRef);
            }
        };
    }, [])
);

@HTInvest - Извините, я не использовал useFocusEffect (или React Native) и неправильно прочитал это (я смотрел на него, просто недостаточно внимательно!). Я исправил ответ, спасибо!

T.J. Crowder 08.05.2022 13:38

Другие вопросы по теме

Как я могу изменить цвет плитки, по которой щелкнули древовидную карту в highcharts, используя реакцию
Как заставить состояние исчезнуть через некоторое время (React)?
Почему я не могу получить элемент из mongodb, когда добавляю элемент с помощью user.email?
Как я могу управлять действиями отправки в наборе инструментов Redux с помощью React Native?
Где я должен разместить файл среды в клиентском приложении, основанном на реакции?
Предупреждение: вы предоставили свойство `value` для поля формы без обработчика `onChange`. Это отобразит поле только для чтения. Если поле должно быть
Когда myItems является пустым массивом, он говорит: «myItem.map() не является функцией». как решить?
Не удается получить prevState из хука жизненного цикла componentDidUpdate в React.js v18.1.0
Как отобразить счетчик при загрузке данных с сервера с помощью fetch API в REACT JS?
Как удалить значение формы после отправки в React из приведенного ниже кода?