为啥这个异步函数无限循环?

Posted

技术标签:

【中文标题】为啥这个异步函数无限循环?【英文标题】:Why is this async function infinite looping?为什么这个异步函数无限循环? 【发布时间】:2021-10-16 02:23:31 【问题描述】:

我已将我的应用程序降至最低限度,以试图了解它为什么会无限循环......但我不明白。

const App = () => 

  console.log("just logging that the app ran!")
  
  const [data, setData] = useState('initial state');
  
  const getAsset = async () => 
  
    console.log("logging that getAsset ran!")

  setData("new state!")
  console.log(data)

  
  getAsset();
  
  return (

    <div >
      data
    </div>
  );


export default App;

任何指针?

错误信息:

react-dom.development.js:14997 Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.

【问题讨论】:

这能回答你的问题吗? How to async await in react render function? TL;DR: setData 触发一个新的渲染,它再次调用getAsset,这是循环! ***.com/questions/55265604/… 【参考方案1】:

只需在 useEffect 挂钩中调用 getAsset。不知道为什么这个函数是async。在您的情况下,setData 导致重新渲染并再次调用导致循环的 getAsset 函数

工作沙盒:https://codesandbox.io/s/react-hooks-example-forked-0rqb9?file=/src/App.js

const App = () => 

  const [data, setData] = useState("initial state");

  useEffect(() => 
    getAsset();
  , []);

  const getAsset = async () => 
    setData("new state!");
  ;

  return <div>data</div>;
;

export default App;

【讨论】:

【参考方案2】:

每次渲染组件时,您的代码都会调用 getAsset() 和 getAsset setState (setData) 并且当您更改状态时,组件会重新渲染,它会再次调用 getAsset 并再次重新渲染............

你需要在挂载时调用它,所以使用 useEffect


const App = () => 

  console.log("just logging that the app ran!")
  
  const [data, setData] = useState('initial state');
  
  const getAsset = async () => 
  
    console.log("logging that getAsset ran!")

  setData("new state!")
  console.log(data)

 
 useEffect(() => 
getAsset();

,[])

  
  return (

    <div >
      data
    </div>
  );


export default App;

【讨论】:

【参考方案3】:

问题在于,每次状态更改时,React 都会重新运行 App,这意味着直接在 App 中调用 getAsset 而无需检查它是否已经运行,这将导致循环。

// Runs when the component is rendered.
const App = () => 
  // ...
  getAsset(); // Sets state, re-rendering app.
  // ...
  return (
    <div >
      data
    </div>
  );

要解决此问题,请检查以确保仅设置一次状态或新状态何时不同,这样就不会发生循环行为。

【讨论】:

以上是关于为啥这个异步函数无限循环?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个函数不会陷入无限循环? [复制]

为啥这个回调会产生无限循环

有人能告诉我为啥这个方法会进入无限循环吗?

使用 setInterval() 的无限异步循环 [重复]

为啥这个 Scanf 会导致无限循环?

为啥这会导致无限循环