(闭门)
我怎么能等待,解决/拒绝,由一个函数返回的promise包装在反应挂钩"useMemo"?
目前,我的代码如下:
// Get the persisted email/username
const persistedUsername = useMemo(async () => {
let username;
try {
username = await AsyncStorage.getData(`@${ASYNC_STORAGE_KEY}:username`);
} catch {}
return username;
}, []);
我试图实现的是在组件呈现之前获取数据,这是某种“组件意志安装”生命周期。我的两个选择是:
@DennisVash在评论中提出了该问题的解决方案:
使用useLayoutEffect钩子(某种componentDidMount/componentDidUpdate)阻止所有视觉效果,其中代码在DOM更新之后,但在浏览器有机会“绘制”这些更改之前立即运行。
如您所见,persistedUsername仍然是一个promise(我不会等待异步函数的结果)。。。
有什么想法吗?用这个钩子执行异步作业不是一个好主意吗?有定制的钩子吗?
另外,与使用useEffect和useState相比,以这种方式执行此操作有哪些缺点?
同样的事情使用效果和使用状态:
useEffect(() => {
// Get the persisted email/username
(async () => {
const persistedUsername = await AsyncStorage.getData(
`@${ASYNC_STORAGE_KEY}:username`
);
emailOrUsernameInput.current.setText(persistedUsername);
})();
}, []);
非常感谢。
似乎问题在于如何使用钩子来使用componentWillMount
,这几乎等同于useLayoutEffect
(因为componentWillMount
已被弃用)。
有关更多其他信息,您不应该在usemo
中解析async
操作,因为您将阻止线程(JS是单线程的)。
也就是说,您将等待promise得到解决,然后继续计算组件。
另一方面,像useffect
这样的异步钩子是一个更好的选择,因为它不会阻止它。