javascript - React Native - 应用程序在运行和应用“setInterval”后崩溃
问题描述
我是来问一个我一天都解决不了的问题。
应用setInterval后,我的应用程序在物理 android 手机上崩溃,在我的模拟器中显示一个我不熟悉的错误。
在物理 android 手机和模拟器中,在我登录应用程序并在特定页面/屏幕上停留一分钟后,它会崩溃或显示错误。
这是我的代码
export default class tables extends Component {
constructor(props){
super(props)
this.state = {
data: [],
....
}
}
fetchData = async () => {
const response = await fetch('http://192.168.254.***:****/table');
const json = await response.json();
this.setState({ data: json });
}
componentDidMount = () => {
this.Set_int = setInterval(() => {
this.fetchData().then(() => {
this.setState({ isLoading: false })
});
}, 5000);
}
componentWillUnmount = () => {
clearInterval(this.Set_int);
}
render() {
return (
<View>
....
.......
</View>
)
}
}
这是错误:
我的控制台日志:
解决方案
2693896
在服务器日志中可能指的是响应长度,并且解析为对象的 2.6 Mb JSON 响应可能会占用大量 RAM。无论前一个请求是否完成,每 5 秒请求一次数据。如果客户端或服务器无法以该速度处理数据,请求和状态更新将累积并占用所有可用 RAM。
setInterval
通常不应该与 Promise 一起使用,因为它忽略了 Promise 链。
为了改善这种情况,应该只在状态更新完成时安排一个新的间隔,或者如果应该保留 5s 间隔,可以使用abortable fetch取消请求。
推荐阅读
- c++ - 如何使用内存以及 const char* const arr[][] 的大小是多少?C++
- javascript - 如何使用 JQuery 从外部文件中获取对象?
- java - -XX:HeapDumpPath 文件输出到远程位置
- python - 有没有更有效的方法来根据列的内容从 PyArrow 表中选择行?
- spring - 如何分别处理来自 HTTP 和 HTTPS 的请求 Spring Boot 2 在两个单独的端口上运行 Tomcat?
- google-bigquery - BigQuery:连接两个数组并在 MERGE 语句中保留不同的值
- reactjs - 当表单验证出错时,如何防止按钮提交表单起作用?
- java - 如果用户移动或重命名文件,您的应用能否跟踪用户的文件?
- azure-active-directory - 使用 Azure AD 帐户登录 Windows 时,圆点永无止境
- reactjs - 当数据在缓存中可用时,停止中继现代 useLazyLoadQuery 在分页中重新获取?