💡 React Hooks:useEffect 中的异步函数为什么会发生这种情况?

2025-05-25

💡 React Hooks:useEffect 中的异步函数

为什么会发生这种情况?

当你刚开始学习 React Hooks 时,你可能会注意到,如果在 useEffect Hook 中使用异步函数,就会出现警告和错误。让我们来了解一下为什么会发生这种情况。

关于如何在 React Hooks 中使用异步的文章和问题有几十篇:

为什么会发生这种情况?

异步函数总是返回一个承诺,因此在承诺实现之前你不会得到实际值。

反模式:直接在 useEffect 中使用异步函数

React 可以运行此异步函数,但无法运行清理函数。
请勿在 useEffect 中直接使用原始异步函数。

useEffect(async () => {
  console.log('Hi :)')

  return () => {
    console.info('Bye!') // It won't run
  };
}, []);
Enter fullscreen mode Exit fullscreen mode

代码示例:在异步函数中使用 unmount。

除非您在回调之前使用 await 表达式,否则您不必卸载回调。

unmount = await (async () => {
  console.log('Hi :)')

  return () => {
    console.info('Bye!')
  };
})()
unmount()
// Hi :)
// Bye!
Enter fullscreen mode Exit fullscreen mode

代码示例:在函数中使用 unmount。

unmount = (() => {
  console.log('Hi :)')

  return () => {
    console.info('Bye!') // 👍 
  };
})()
unmount()
// Hi :)
// Bye!
Enter fullscreen mode Exit fullscreen mode

代码示例:在 useEffect 中使用异步函数。

您可以在 useEffect 回调中创建一个异步函数,正如 Nick 在他的文章中提到的那样。

  useEffect(() => {
    (async () => {
      const products = await api.index()
      setFilteredProducts(products)
      setProducts(products)
    })()

    return () => {
      unsubscribeOrRemoveEventHandler() // 👍 
    }
  }, [])
Enter fullscreen mode Exit fullscreen mode

我希望你觉得这篇文章有用。

文章来源:https://dev.to/danialdezfouli/what-s-wrong-with-the-async-function-in-useeffect-4jne
PREV
宣布推出 TechSchool:一个学习编程的免费开源平台
NEXT
Typescript 日常使用的技巧和窍门