Как я могу дождаться, чтобы разрешить/отклонить обещание, возвращаемое функцией, завернутой в хук реакции «useMemo»?
В настоящее время мой код выглядит так:
// Get the persisted email/username
const persistedUsername = useMemo(async () => {
let username;
try {
username = await AsyncStorage.getData(`@${ASYNC_STORAGE_KEY}:username`);
} catch {}
return username;
}, []);
Чего я пытаюсь добиться, так это получить данные до того, как компонент будет визуализирован, своего рода жизненный цикл «componentWillMount». У меня было два варианта:
@DennisVash предложил решение этой проблемы в комментариях:
Блокировка всех визуальных эффектов с помощью хука useLayoutEffect (какой-то компонентDidMount/componentDidUpdate), когда код запускается сразу после обновления DOM, но до того, как браузер успел «отрисовать» эти изменения.
Как видите, persistedUsername все еще обещание (я не жду результата асинхронной функции)...
Есть идеи? Не лучше ли выполнять асинхронные задания с помощью этого хука? Любой кастомный крючок?
Кроме того, каковы недостатки выполнения этой операции таким образом по сравнению с использованием useEffect и useState?
То же самое с useEffect и useState:
useEffect(() => {
// Get the persisted email/username
(async () => {
const persistedUsername = await AsyncStorage.getData(
`@${ASYNC_STORAGE_KEY}:username`
);
emailOrUsernameInput.current.setText(persistedUsername);
})();
}, []);
Спасибо.
мне кажется, что вместо этого больше подходит для useEffect
и useState
@thedude Да, я тоже так думал, но, возможно, это можно сделать с помощью useMemo (я никогда не использовал его для асинхронных операций).
Вы знаете разницу между useEffect
и useMemo
? Они не служат той же цели, зачем вам делать асинхронное действие в useMemo
? Вы в основном спрашиваете, в чем разница между ними?
@DennisVash useEffect заключается в выполнении действий после рендеринга, последнего выполнения компонента, верно? И используйтеMemo для выполнения весовых действий, избегая их повторного вычисления при каждом рендере.
По сути, я подумал использовать его здесь, потому что, если бы процесс получения постоянного имени пользователя не был асинхронным, имело бы смысл выполнить это до рендеринга (какой-то жизненный цикл componentWillMount)
Итак, вы спрашиваете, как использовать componentWillMount
с крючками? Попробуйте немного поискать, это почти идентично использованию useLayoutEffect
Ваш вопрос звучит как проблема XY xyproblem.info, где вы спрашиваете о своей попытке решения с помощью useMemo
и useEffect
вместо того, чтобы спрашивать о реальной проблеме, которую вы пытаетесь решить.
@DennisVash моя вина, извините, я постараюсь отредактировать вопрос, чтобы упростить понимание проблемы. Также большое спасибо за информацию, это решило мою проблему, я не знал о хуке useLayoutEffect.
Похоже, вопрос в том, как использовать componentWillMount
с хуками, что почти эквивалентно useLayoutEffect (поскольку componentWillMount
устарело).
Чтобы получить дополнительную информацию, вам НЕ следует разрешать действие async
в useMemo
, поскольку вы заблокируете поток (а JS является однопоточным).
Это означает, что вы будете ждать, пока обещание будет разрешено, а затем продолжится вычисление компонента.
С другой стороны, асинхронные хуки, такие как useEffect
, являются лучшим вариантом, поскольку они не будут его блокировать.
Итак, объявите обещание внутри
useMemo
и назовите его?...