【发布时间】:2020-12-15 01:32:35
【问题描述】:
我正在开发一个用于与 BLE 设备通信的 React Native 应用程序。为了跟踪连接是否仍然建立,我在组件中使用了一个状态。
const [isConnected, setIsConnected] = useState(props.route.params.isConnected || false);
在我的 useEffect 钩子中,我开始一个间隔来重复读取我的 BLE 设备的状态,如下所示:
useEffect(() => {
AppState.addEventListener('change', onAppStateChange);
updateStatusRepeatedly.current = setInterval(readStatus, 5000);
return () => {
AppState.removeEventListener('change', onAppStateChange);
clearInterval(updateStatusRepeatedly.current);
};
}, []);
readStatus 函数每 5 秒调用一次,它按预期工作。但是不应该执行的内容。所以我将它包装在一个基于isConnected 变量的条件语句中。
const readStatus = () => {
if (isConnected) {
readAddedCharge();
readPowerMeasurement();
}
};
内容每次都会被执行。即使 isConnected 变量设置为 false。我不明白为什么,因为其他功能和组件正确考虑了isConnected。
知道为什么其他函数和组件会注册 isConnected 的更改,而作为计时器调用的 readStatus 函数不会?
【问题讨论】:
-
Dan Abramov 可能会发现 this article 很有用,他创建了一个
useInterval()钩子 -
@amik 为我提供了解决我问题的答案。但我肯定也会对此进行研究。谢谢。
标签: javascript reactjs timer scope closures