【发布时间】:2021-07-06 05:40:43
【问题描述】:
我正在尝试模仿 React useEffect 竞争条件并使用 AbortController 处理它。我永远无法击中 catch 块(我猜),因为 setTimeOut 在获取请求后被调用。我的问题是如何重写此代码以将 fetch 放入 setTimeout 并且仍然能够使用 AbortController 取消请求?
import './App.css';
import {useState,useEffect} from 'react'
function App() {
const [country, setCountry] = useState('N.A.')
const [capital, setCapital] = useState('')
useEffect(() => {
const ctrl = new AbortController();
const load = async() =>{
try
{
//debugger
const response = await fetch(`https://restcountries.eu/rest/v2/capital/${capital}`,
{signal:ctrl.signal})
const jsonObj = await response.json()
setTimeout( ()=> {setCountry(jsonObj[0].name)} , Math.random()*10000)
}
catch(err)
{
console.log(err)
}
}
load();
return () =>{
ctrl.abort()
};
}, [capital])
return (
<div>
<button onClick={()=>setCapital("Berlin")} >Berlin</button>
<button onClick={()=>setCapital("Paris")} >Paris</button>
<button onClick={()=>setCapital("Madrid")} >Madrid</button>
<div>
{country}
</div>
</div>
);
}
export default App;
【问题讨论】:
-
这里有需要使用 setTimeout 的理由吗?在我看来,删除那个 setTimeout 可以解决你的问题。
标签: reactjs use-effect