React Native中finally调用setState致网络指示器不显示的问题
为什么React Native中finally里的setState没让网络指示器显示?
这问题我之前也踩过一模一样的坑!核心原因根本不是React Native版本或者Android系统的问题,是你对Promise的finally用法理解错了。
咱们拆解下你的代码问题:
- 你写的是
.finally(this.setState({networkActivity: false}))——这里你直接执行了setState,而不是把它包装成一个函数传给finally。这就导致在fetch还没开始发起请求的时候,这条setState就已经跑了,把networkActivity立刻设为false,指示器刚要显示就被关掉,自然看不到任何效果。 - 而你在
then/catch里应该是写成了.then(() => { this.setState(...) })这种函数形式,所以是等请求真正结束后才执行setState,这时候指示器就能正常显示了。
再结合你用的React Native 0.51版本,这个版本里的Promise finally实现对参数的要求很严格,必须传递一个回调函数,不然就会立刻执行你写的表达式,不会等Promise完成状态变更。
正确的写法应该是这样:
this.setState({networkActivity: true}); fetch(...) .then(response => { // 处理你的响应逻辑 }) .catch(error => { // 处理你的错误逻辑 }) .finally(() => { this.setState({networkActivity: false}); });
把setState放在一个箭头函数里传给finally,这样只有当fetch的Promise完成(不管成功还是失败)时,才会执行这个箭头函数里的setState,指示器就能在请求期间正常显示了。
内容的提问来源于stack exchange,提问作者dombal
相关产品推荐
相关产品推荐

