Я использую этот код:
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() не вызывается.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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) и неправильно прочитал это (я смотрел на него, просто недостаточно внимательно!). Я исправил ответ, спасибо!
Вы не используете
useEffectв этом коде.