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, ...
随机推荐
- 用drawRect以及CAReplicatorLayer绘制动态水波纹
用drawRect以及CAReplicatorLayer绘制动态水波纹 大大简化了写水波纹效果的难度,你可以根据示例自己组装水波纹效果,本设计是几个工具组合在一起完成的效果, DrawRectObje ...
- 手游开发Android平台周边工具介绍
1.渠道接入 主要是需要接入各平台的登录.充值接口,各家SDK又不统一,Android渠道都是鱼龙混杂,就算小渠道你看不上,但量多了,加起来也还可观,所以大家都拿出吃奶的尽去铺渠道.国内几大主要的An ...
- ios之快速领会VFL的demo
在网上看到一篇blog,超正!快速领会ios的vfl. 这里贴上blog的地址. http://www.thinkandbuild.it/learn-to-love-auto-layout-prog ...
- Android之对TabActivity的见解,个人觉得不错
http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html answer1991 无法停止我内心的狂热,对未来的执着. Andr ...
- 测试 Java 类的非公有成员变量和方法
引言 对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的 ...
- cesium and three.js【转】
https://blog.csdn.net/zhishiqu/article/details/79077883 这是威尔逊Muktar关于整合Three.js与铯的客人帖子.Three.js是一个轻量 ...
- libcurl进行HTTP GET获取JSON数据(转载)
转载:http://blog.csdn.net/vincent2610/article/details/68488365 #include <stdio.h> #include <i ...
- 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇(转)
.net 框架号称永远不会发生内存泄漏,原因是其引入了内存回收的机制.但实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最 常见的情况就是给对象添加了事件处理函数,但当 ...
- C# 图片识别(支持21种语言) (转)
图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号. 图片识别的用途:很多人用它去破解网站的验证码,用于达到自动刷票或者是批量 ...
- Longest Palindromic Substring leetcode java
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...