提问者:小点点

如何使用异步函数的反应钩子"useMemo"?


(闭门)

我怎么能等待,解决/拒绝,由一个函数返回的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;
  }, []);  

我试图实现的是在组件呈现之前获取数据,这是某种“组件意志安装”生命周期。我的两个选择是:

  1. 使用useMemo钩子计算值以避免不必要的重新计算

@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);
    })();
  }, []);

非常感谢。


共1个答案

匿名用户

似乎问题在于如何使用钩子来使用componentWillMount,这几乎等同于useLayoutEffect(因为componentWillMount已被弃用)。

有关更多其他信息,您不应该在usemo中解析async操作,因为您将阻止线程(JS是单线程的)。

也就是说,您将等待promise得到解决,然后继续计算组件。

另一方面,像useffect这样的异步钩子是一个更好的选择,因为它不会阻止它。

相关问题