Я думаю, что вы действительно близки, но я бы сделал это немного по-другому.Во-первых, у меня была бы вся позиция в одном состоянии:
const [devicePosition, setDevicePosition] = React.useState({
centerX: 0.0,
centerY: 0.0,
deviceX1: 0.0,
deviceY1: 0.0,
deviceX2: 0.0,
deviceY2: 0.0,
})
Во-вторых, я бы удалил компонент isMounting из состояния.Вы не хотите использовать состояние, чтобы определить, следует ли обновлять состояние.Вы можете обновить isMounting на не смонтированном компоненте.
В-третьих, я бы удалил useEffect, которое вызывается при каждом рендеринге.Маловероятно, что вам нужно делать вызовы остальных при каждом рендере.Основываясь на коде, я думаю, что вы хотите сделать вызов при первом рендере, а затем установить таймер.
Ниже показаны эти изменения.
const [alpha, setAlpha] = React.useState(0.0)
const [devicePosition, setDevicePosition] = React.useState({
centerX: 0.0,
centerY: 0.0,
deviceX1: 0.0,
deviceY1: 0.0,
deviceX2: 0.0,
deviceY2: 0.0,
})
const [timer, setTimer] = React.useState(null)
let isMounted = true
React.useEffect(() => {
const handleOrientation = e => setAlpha(e.alpha)
window.addEventListener("deviceorientation", handleOrientation, true)
updateDevicePosition() //make rest call on mounting
return () => {
window.removeEventListener("deviceorientation", handleOrientation)
isMounted = false
}
}, [])
async function updateDevicePosition() {
try {
const result = await fetch("http://192.168.10.233:34599/")
const data = await result.json()
if (isMounted) { //so you aren't setting state on an unmounted component
setDevicePosition({
centerX: data[0].x,
centerY: data[0].y,
deviceX1: data[1].x,
deviceY1: data[1].y,
deviceX2: data[2].x,
deviceY2: data[2].y,
})
}
} catch (e) {
console.error(e)
}
if (isMounted) {
clearTimeout(timer)
setTimer(setTimeout(updateDevicePosition, 200))
}
}