1 回答
TA贡献1836条经验 获得超5个赞
提供给 useEffect 的回调必须返回一个函数或未定义(如果提供了一个函数,则这被认为是一个清理函数。清理函数用于分离事件侦听器,取消任何正在进行的请求,并防止如果组件被卸载则进行任何更新)
为了访问您的http请求产生的响应,您应该将其存储在一个状态中(您可以使用useState或useReducer)
const [rest, setResp] = React.useState();
React.useEffect(() => {
wait().then(_ => getData()).then(setResp);
}, [YOUR_DEPENDENCIES]);
// update jsx based on rest
根据您问题中的更新,您需要的是轮询
请查看下面的示例(请记住,这是说明可能的解决方案的代码)
function usePolling(fetcher, interval) {
const [payload, setPayload] = React.useState(null);
React.useEffect(function () {
// you must implement the error handling
fetcher()
.then(function (resp) {
setPayload(resp)
})
}, [fetcher]);
React.useEffect(function () {
let timeoutId;
function poll() {
timeoutId = setTimeout(function () {
// you must implement the error handling
fetcher()
.then(function (resp) {
setPayload(resp)
poll();
})
}, interval);
}
poll()
return function () {
clearTimeout(timeoutId);
}
}, [fetcher, interval]);
return payload;
}
function App() {
const payload = usePolling(function () {
return Promise.resolve(Date.now())
}, 3000);
return (
<div>polling payload: {payload}</div>
)
}
ReactDOM.render(<App/>, document.getElementById('app'))
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
</head>
<body>
<div id="app"></div>
</body>
</html>
添加回答
举报