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

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

场景如下图:

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

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

即: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. Hackerrank--XOR love (Math系列)

    题目链接 Devendra loves the XOR operation very much which is denoted by ∧ sign in most of the programmin ...

  2. poj 1679 The Unique MST 判断最小生成树是否唯一(图论)

    借用的是Kruskal的并查集,算法中的一点添加和改动. 通过判定其中有多少条可选的边,然后跟最小生成树所需边做比较,可选的边多于所选边,那么肯定方案不唯一. 如果不知道这个最小生成树的算法,还是先去 ...

  3. 在Deepin Linux折腾python pip

    首先通过wget命令下载get-pip.py 地址在https://bootstrap.pypa.io/get-pip.py $ wget https://bootstrap.pypa.io/get- ...

  4. 学习JDK1.8集合源码之--WeakHashMap

    1. WeakHashMap简介 WeakHashMap继承自AbstractMap,实现了Map接口. 和HashMap一样,WeakHashMap也是一种以key-value键值对的形式进行数据的 ...

  5. 查询单表菜单是,sql

    START WITH CONNECT BY PRIOR这个语法主要用于查询数据包中的树型结构关系.先看下原始数据时怎么样的吧! 表中第一行1001是1002的父节点,而第二行1002又是1003的父节 ...

  6. 跟我一起使用webpack给一个开源项目添加一个运行入口

    啦啦啦啦啦不要把webpack想的很高大上就放弃了探究的想法,其实webpack特别的平易近人,就是一个工具 今天看到了一个超级美丽的项目 你可以看到各种各样的口红色号,满屏的粉色,哇哇哇哇塞,美美哒 ...

  7. webpack学习之—— 模块热替换(Hot Module Replacement)

    模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换.添加或删除模块,而无需重新加载整个页面.主要是通过以下几种方式,来显著加快开发速度: 保留在完全重 ...

  8. SQL Server导入数据报错"无法在只读列“Id”中插入数据"

    使用sql server 导入数据报错:无法在只读列'id'中插入数据.如下图所示: 查找出现该问题的原因是表中id为自动增长的标识列,需要在[编辑映射]中勾选"启用标识插入": ...

  9. twisted(转)

    reactor.protocol 这两个类都在 twisted.internet 命名空间中 reactor对象是Twisted编程当中的第一步,它就是一个反应器,专门负责与服务端的连接以及监听与服务 ...

  10. Eclipse创建jsp web项目

    Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插件集,包括Java开 ...