Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “如何使用反应钩”;使用备忘录“;使用异步函数?_Javascript_Reactjs_React Native_Async Await_React Hooks - Fatal编程技术网

Javascript “如何使用反应钩”;使用备忘录“;使用异步函数?

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

(闭门)

我如何等待、解析/拒绝由封装在react钩子“useMemo”中的函数返回的承诺

目前,我的代码如下所示:

  // Get the persisted email/username
  const persistedUsername = useMemo(async () => {
    let username;

    try {
      username = await AsyncStorage.getData(`@${ASYNC_STORAGE_KEY}:username`);
    } catch {}

    return username;
  }, []);  

编辑 我试图实现的是在呈现组件之前获取数据,某种类型的“组件将挂载”生命周期。我的两个选择是:

  • 使用useMemo钩子计算值以避免不必要的重新计算
  • 组合使用效果+使用状态。这不是最好的主意,因为useEffect在组件绘制之后运行
  • @DennisVash在评论中提出了该问题的解决方案:

    使用useLayoutEffect钩子(某种componentDidMount/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);
        })();
      }, []);
    

    谢谢。

    问题似乎在于如何使用钩子来使用
    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执行权重操作,避免在每次渲染中重新计算权重。