【发布时间】:2021-07-02 23:16:28
【问题描述】:
在 React 项目中,我正在从后端使用 API 来了解此人何时对视频通话 (VC) 请求进行了更改。例如,作为用户,我向那个人请求 VC,当那个人更新 VC 状态(如“已接受”、“拒绝”或“重新安排”)时,该数据将反映在前端,即 React 代码中。我正在使用不依赖数组的 useEffect 每 10 秒运行一次以获取状态数据。但是,这里的主要问题是资源利用率很高并且后端服务器冻结。那么获取“已更改”的后端数据的最佳解决方案是什么。
以下是参考代码
const [allRequestsData, setAllRequestsData] = useState([])
const myRequestsData = async () => {
var newRequest = await fetch(`${config.baseUrl}videocall/list`, {
method: 'GET',
headers: {
'ApiKey': config.apiKey,
'artistid': config.artistId,
'platform': config.platform,
'V': config.version,
'Product': 'apm',
'Authorization': sessionStorage.getItem('tokenNew')
}
}).then((data) => data.json())
setAllRequestsData(newRequest.data.list)
}
useEffect(() => {
myRequestsData()
}, []) {/* <-- Here the function is updated only once */}
{/*
useEffect(() => {
setInterval(() => {
myRequestsData()
}, 10000)
})
*/} {/* Here the server freezes as it continuously calls data from backend every 10 seconds */}
我的意图是仅当另一端的人更新状态数据时才更新 VC 的状态。为了清楚起见,请参阅以下代码
allRequestsData.map((data) => {
data.status == "Accepted" ? (<h2>Accepted</h2>) : data.status == "Rejected" ? (<h2>Rejected</h2>) : ''
})
如上所示,状态数据需要更新,但仅在后端数据更改时才显示数据。
那么,只有在后端数据发生更改时才显示数据的合适解决方案是什么?
【问题讨论】:
-
你忘记了
map回调中的return。 -
你的第二个
useEffect也应该有一个空的依赖数组,所以你只开始一个间隔而不是每次触发效果时都开始一个新的间隔。轮询后端的替代方法是使用套接字并建立订阅并向订阅者推送(发布)更新。 -
@DrewReese 是的,我还在第二个 useEffect 中添加了空依赖数组,但是,仍然大量使用后端数据......你说的其他解决方案是套接字,但是,那会有效吗?
-
@Pranav,你的问题是接口调用频繁?使用websocket就可以解决。后端仅在状态发生变化时才向浏览器发送数据
-
好吧,我已经使用套接字来使用 api,但是显示错误为 'GET 'htpps://.....' not found
标签: javascript reactjs