在前端项目中,我们经常会碰到这样的场景:

  当前我们有一个表单需要填写,在完成表单填写后经过校验之后会弹出短信或者其他形式验证码,进行补充校验,然后一起提交给接口。

场景如下图:

当前为创建操作,编辑操作与重置操作也会复用这个验证码弹窗

  通常我们使用与事件绑定的回调函数进行处理,这也更符合我们常见的事件响应机制的实现方式。将处理逻辑分散各个回调函数中。

即:formSubmitBtn触发弹窗展示,然后ModalSubmitBtn触发api提交逻辑,之后在提交函数中处理返回信息或者将异步的promise实例返回,由上级函数继续处理。

  在基于React实现的项目中,为了更好复用代码及逻辑,通常会把弹窗、Form这样的基础组件结合基础业务逻辑封装成组件。在上文描述的流程中,就会出现这样的问题,我们的参数、状态需要在各个组件中频繁传递,每个组件内部除了自身封装逻辑外,还会包含当前交互流程的部分业务代码,当这个验证码组件被复用到编辑和重置操作时,就需要借助传入不同的回调函数来保证各个操作的正常进行,然后还需要根据各个操作不同添加后续的判断。而我们的处理上下文也会在各个组件内不断的切换,陷入回调来回传递的漩涡。

  

  为了减少回调的干扰,降低业务组件的耦合,我们可以借助promise和async的异步特性,将整个过程从回调嵌套方式转为同步方式,集中在一个方法顺序执行,减少上下文的切换。

  比如,将激活弹窗->输入验证码->返回验证码看做一个异步动作,创建一个promise实例,然后传入resolve和reject钩子函数, 然后在主函数中借助于async、await去等待响应结果,这样再同一个context中我们就可以顺序执行整个流程,减少上下文切换带来的负担。

  

  进一步思考:如果我们打算对返回结果进行判断,如果是验证码错误(这里我们假设返回的status状态为403, 正常status为200),则保留弹窗,允许用户继续填入验证码然后提交该怎么实现呢。

  答案是借鉴递归函数的调用自身的特性实现。

  对上述行为,进行抽象,我们可以归纳为formSubmit这一行为在response响应status=403时,产生了循环。对于循环效果,除了我们常见的for、while等实现形式外,函数调用自身(递归)也可以达到循环的效果。

  所以,我们可以在提交请求后处理response时,在response.status=403条件成立时调用formSubmit函数,达到上述的效果。

  未完,待续...(后续会补充两种情况的模型)

  

async/await运用-前端表单弹窗验证同步书写方式(React)的更多相关文章

  1. 如何使用thinkphp的model来验证前端表单?

    为了增加安全性, 在向model表中写入和修改数据时, 最好是调用 create方法来保证安全, 然后再调用add和save方法: if($Model->Validate($validate)- ...

  2. Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------

    Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...

  3. easyui表单多重验证,动态设置easyui控件

    要实现的功能:在做添加学生信息的时候,利用easyui的验证功能判断 学号是否重复和学号只能为数字 最终效果如下图: 但在做这个的过程中,遇到了一系列的问题: 扩展validatebox的验证方法,最 ...

  4. HTML5表单及其验证

    随笔- 15 文章- 1 评论- 115 HTML5表单及其验证   HTML表单一直都是Web的核心技术之一,有了它我们才能在Web上进行各种各样的应用.HTML5 Forms新增了许多新控件及其A ...

  5. Angualr6表单提交验证并跳转

    在Angular6中,使用NG-ZRROR作为前端开发框架,在进行表单开发时遇到了一些问题,最后解决了,在此记录. 1.表单构造: 引入forms: import { FormGroup, FormB ...

  6. thinkphp表单自动验证

    ThinkPHP框架表单验证 对注册到test表的表单进行验证 在注册之前要对表单进行验证: 用户名非空验证,两次输入密码必须一致即相等验证,年龄在18~50之间即范围验证,邮箱格式正则验证. 自动验 ...

  7. PHP表单与验证

    一.Header()函数 标头 (header) 是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字符串,在标头与 HTML 文件之间尚需空一行分隔. /*一.Header()函数 */ ...

  8. bootstrap表单带验证

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  9. jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...

随机推荐

  1. 理解es6箭头函数

    箭头函数知识点很少,但是要理解清楚,不然看代码会很不适应的. 1. 最简单的写法 x => x*x 可以理解为 我的x要被转化为x*x,所以实际相当于下边的这个 function (x){ re ...

  2. ucore 物理内存探测 lab2 附录A&B

    探测物理内存分布的大小和方法 bootloader 增加的工作 bootasm.S 中对应了 probe_memory 到 finish_probe 的部分. 通过BIOS 中断 获取内存可调用参数为 ...

  3. pytorch 常用问题解决

    1.RuntimeError: cuda runtime erorr (77): an illegal memory access was encountered at 在使用命令前面加上CUDA_L ...

  4. FTP权限问题解析,553 Can't open that file: Permission denied

    FTP上传文件,提示553 Can't open that file: Permission denied 原因: 目录的所属组,所属用户属于root, 导致FTP无法上传, 修改组和所属用户为www ...

  5. 使用Cmder 安装 Composer 出现 "attempt to call a nil value"

    原因: 不是这个原因,也不是那个原因,而是采用了中文路径, 把comder 整个搬到其他目录就行了

  6. Vue--findIndex方法的使用原理

    原理: // 根据id得到下标 // 默认去遍历list集合,将集合中的每个元素传入到function的item里, var index = this.list.findIndex(function( ...

  7. WPF快速入门系列(6)—— WPF资源和样式

    一.引言 WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用.而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果 ...

  8. 超线程(Hyper-Threading)

    运行方式 每个单位时间内,一个CPU只能处理一个线程(操作系统:thread),以这样的单位进行,如果想要在一单位时间内处理超过一个线程是不可能的,除非是有两个CPU的实体单元.双核心技术是将两个一样 ...

  9. 构建PaaS的开源平台:CloudFoundry

    CloudFoundry的架构: 点评:这是vmware用ruby开发的一个paas,由于对ruby不太熟悉,还是比较难理解. refer to :http://www.oschina.net/que ...

  10. ubuntu下C操作Mysql数据库第一步

    学习于: http://armsword.com/2013/06/20/ubuntu-c-mysql.html