Javascript “如何使用反应钩”;使用备忘录“;使用异步函数?
(闭门) 我如何等待、解析/拒绝由封装在react钩子“useMemo”中的函数返回的承诺 目前,我的代码如下所示:Javascript “如何使用反应钩”;使用备忘录“;使用异步函数?,javascript,reactjs,react-native,async-await,react-hooks,Javascript,Reactjs,React Native,Async Await,React Hooks,(闭门) 我如何等待、解析/拒绝由封装在react钩子“useMemo”中的函数返回的承诺 目前,我的代码如下所示: // Get the persisted email/username const persistedUsername = useMemo(async () => { let username; try { username = await AsyncStorage.getData(`@${ASYNC_STORAGE_KEY}:user
// Get the persisted email/username
const persistedUsername = useMemo(async () => {
let username;
try {
username = await AsyncStorage.getData(`@${ASYNC_STORAGE_KEY}:username`);
} catch {}
return username;
}, []);
编辑 我试图实现的是在呈现组件之前获取数据,某种类型的“组件将挂载”生命周期。我的两个选择是:
如您所见,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);
})();
}, []);
谢谢。问题似乎在于如何使用钩子来使用
componentWillMount
,钩子几乎等同于(因为componentWillMount
已被弃用)
有关更多其他信息,您应该在usemo
中NOT解析async
操作,因为您将阻止线程(JS是单线程的)
也就是说,您将等待承诺得到解决,然后继续计算组件
另一方面,像
useffect
这样的异步钩子是一个更好的选择,因为它不会阻止它。似乎问题在于如何将componentWillMount
与几乎等同的钩子一起使用(因为componentWillMount
已被弃用)
有关更多其他信息,您应该在usemo
中NOT解析async
操作,因为您将阻止线程(JS是单线程的)
也就是说,您将等待承诺得到解决,然后继续计算组件
另一方面,像
useffect
这样的异步钩子是一个更好的选择,因为它不会阻止它。所以在usemo
中声明一个承诺并调用它?…在我看来,它更像是useffect
和useState
instead@thedude是的,我也这么想,但也许可以用useMemo来实现这一点(我从未将其用于异步操作)。您知道useEffect
和useMemo
之间的区别吗?它们的用途不同,为什么要在usemo
中执行异步操作?你基本上是在问它们之间有什么区别吗?@DennisVash Useffect是在渲染之后执行操作,最后一次执行组件,对吗?并使用memo执行权重操作,避免在每次渲染中重新计算权重。因此,在usemo
中声明一个承诺并调用它?…在我看来,它更像是useffect
和useState
instead@thedude是的,我也有同样的想法,但也许可以用useMemo做到这一点(我从未将其用于异步操作)。你知道useffect
和usemo
之间的区别吗?它们的作用不一样,为什么你要在usemo
中执行异步操作?你基本上是在问它们之间有什么区别吗?@DennisVash useffect是在渲染后执行操作,最后执行组件,对吗并使用memo执行权重操作,避免在每次渲染中重新计算权重。