ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
转载请注明原文地址:
ReactNative的fetch是天然的异步请求,因此,如果你在一个代码块中使用了fetch,那么在执行的时候程序不会等待网络响应结束才执行下一条代码,而是会直接按顺序执行完整个代码块。而这样的话,某些具有先后条件的代码就会存在结果混乱等问题。
比如:一个登录方法
doLogin(){
//1:根据输入的工号、密码进行登录
fetch(this.hostIP + "/login?user="+this.user+"&password="+this.password).then((response) => response.json())
.then((json) => {
//处理响应
this.isLogin = true
}).catch((error) => {
alert("登录失败,请检查网络连接!")
})
//2:根据登录结果控制跳转
if(isLogin){
this.props.navigation.navigate('Menu')
}else{
alert("登录失败")
}
}
理论上,我们的执行逻辑是先用fetch进行登录,然后根据后台返回结果,控制跳转或弹出失败提示。
然而上述代码在执行时就会出现一旦点击登录按钮就会立刻弹出“登录失败”的提示,等再次点击登录按钮,却又跳转到了主页面。
原因就是因为,第一次点击登录按钮时,fetch异步执行,结果还没有返回,而RN已经执行到下面的if-else代码块了,因此登录失败。
而再次点击时,上一次的fetch结果已经返回了,所以if-else语句就会根据上一次点击时的fetch结果作为判断条件来执行了。
那么,怎么解决呢?ES7提供了终极异步解决方案——async/await语法
我们可以在定义一个含有异步操作的方法时,在其前面加上 async 关键字,标示该方法是异步方法;
而在方法中,使用 await 关键字修饰异步操作,该关键字的作用时:等待该语句执行完毕才执行下一条代码。
这样,我们在具有先后条件限制的代码块中,用await关键字修饰其中的异步代码,即可保证按照顺序执行,从而得到正确的结果了。
改进后的登录方法:
async doLogin(){
//1:根据输入的工号、密码进行登录
await fetch(this.hostIP + "/login?user="+this.user+"&password="+this.password).then((response) => response.json())
.then((json) => {
//处理响应
this.isLogin = true
}).catch((error) => {
alert("登录失败,请检查网络连接!")
})
//2:根据登录结果控制跳转
if(isLogin){
this.props.navigation.navigate('Menu')
}else{
alert("登录失败")
}
}
ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题的更多相关文章
- ReactNative踩坑日志——OnPress随着render()执行被自动调用?
在ReactNative中,Text.Button以及其他Touchable包装成的可点击控件,都可以通过onPress属性为其指定点击时的响应函数. 在有些情况下,我们会把这些点击函数先定义好,然后 ...
- ReactNative踩坑日志——代码执行方式(面向对象)
在ReactNative中,是以面向对象的方式执行代码的.处于同一{}內的代码以对象的形式执行,也就是说,程序虽然会自上而下执行代码,但是它会保证当前整个代码块內的语句执行完毕才执行下一代码块. 举个 ...
- ReactNative踩坑日志——函数绑定this
ES6语法定义的函数没有自动绑定this,所以在函数中使用了 this.xxx 就会报错,因为没有把类实例等this传进函数中. 有两种方法绑定this: 法1:在构造函数中为其他函数绑定this c ...
- ReactNative踩坑日志——如何实现删除scrollview中的视图
在reactNative中,页面是根据state值的变化来重新渲染的.因此,传统的前端开发中通过 id 来移除一个页面元素的做法在这里不适用. 一般,我们是通过遍历数组或map来渲染出scrollvi ...
- ReactNative踩坑日志——fetch如何向服务器传递参数
一:简单参数 简单的参数,我们可以使用手动拼接的方式传递. 格式为: fetch(url?key1=val1&key2=val2&...).then((response) => ...
- ReactNative踩坑日志——页面跳转之——Undefined is not an Object(evaluating this2.props.navigation.navigate)
页面跳转时,报 Undefined is not an Object(evaluating this2.props.navigation.navigate) 出错原因:在一个页面组件中调用了另一个组 ...
- 重新认识 async/await 语法糖
提起.Net中的 async/await,相信很多.neter 第一反应都会是异步编程,其本质是语法糖,但继续追查下去,既然是语法糖,那么经过编译之后,真正的代码是什么样的,如何执行的?带着这些疑问, ...
- Python PEP 492 中文翻译——协程与async/await语法
原文标题:PEP 0492 -- Coroutines with async and await syntax 原文链接:https://www.python.org/dev/peps/pep-049 ...
- C#Framework4.0支持异步async/await语法
由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...
随机推荐
- Mysql 编译安装并使用自定义用户启动
本文基于 Redhat Linux 6.7 的环境,Mysql 版本为 5.5.37 安装前的检查 必备的组件,如果没有使用 yum 进行安装,可以使用网上的源,也可以使用本地光盘作为 Yum 源. ...
- PreApplicationStartMethodAttribute程序启动扩展
一.PreApplicationStartMethodAttribute 类简介 应用程序启动时提供的扩展的支持. 命名空间: System.Web程序集: System.Web(位于 Syst ...
- CountDownLatch使用场景及分析
JDk1.5提供了一个非常有用的包,Concurrent包,这个包主要用来操作一些并发操作,提供一些并发类,可以方便在项目当中傻瓜式应用. JDK1.5以前,使用并发操作,都是通过Thread,Run ...
- 磁共振中的T1, T2 和 T2*的原理和区别
从物理的角度,要理解这几个概念的区别,需要对原子核的磁化有所了解,本文通过一些图示对这几个概念进行简明的介绍. 首先,磁共振最基本的原理就是氢原子核在磁场中自旋运动时所具有的量子力学特性.在一个均匀磁 ...
- windows server 2008 r2 启用索引(转)
08r2的“windows search”服务默认是不安装的,要想启用索引执行下列步骤: 1.打开“服务器管理”——选中“角色”——右边选中“添加角色”——勾选“文件服务”. 2. ...
- VS单元测试中Assert类的用法
首先说介绍一下,Assert类所在的命名空间为Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio ...
- python2.7 调用 .net的webservice asmx
首先安装pip install suds 或下载:https://pypi.org/project/suds-jurko/0.6/#files 这个是最新版本 由于不支持python3.6, 所以只能 ...
- Android -- Property Animation
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...
- rqnoj-329-刘翔!加油!-二维背包
注意排除干扰项. 因为价值不会相等,所以价值的多少与本题没有任何关系,. 所以价值为干扰项,所以不用考虑. 二维背包,简单求解. #include<stdio.h> #include< ...
- ProBase
http://haixun.olidu.com/probase.html A Data Driven Semantic Network for Text Understanding Probase i ...