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

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

场景如下图:

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

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

即: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. C#多线程之间事件通知

    我有两个线程,线程1接受网络数据,存到队列;线程2取队列,进行各种复杂的处理然后绘制到界面上;想让线程1有数据了通知线程2,线程2再取队列,因为不通知的话,线程2一直在while循环检索队列时候有东西 ...

  2. linux 利用 alias 自定义快捷命令

    例如:alias avi='cd /home/study/goodstudy/goodgoodstudy/english/movie/avi'则后续命令行输入 avi , 就自动执行了  cd xxx ...

  3. HTML 页面间传值(包含中文)

    A页面——>B页面 A页面 $('.edit-bottom').click(function () { var word1=$('#word').val();//需要传到B页面的值 var ur ...

  4. tomcat9 gzip

    我认为apr模式比较屌所以 <Connector port=" protocol="org.apache.coyote.http11.Http11AprProtocol&qu ...

  5. Axure之添加点击页面

    添加悬停字体变色的效果 页面载入时的频道预设(我做错了,英文版本不知道那个是页面载入时的事件) 我的博客不够完善,看不到全部的图片.我后续会修改我的网站的

  6. UE4物理模块(二)---建立物体碰撞

    在前文中介绍了什么是物理以及如何在UE4和PhysX中进行可视化调试: Jerry:UE4物理模块(一)---概述与可视化调试​zhuanlan.zhihu.com 这里调试只谈到了碰撞盒(后续还会有 ...

  7. BootStrap 栅格化换行问题

    bootstrap 3的栅格系统有时会出现错位情况,原因是上一行的元素高度不一,导致元素float错误. 解决方法 使用栅格系统的时候,应该在每一行都使用row单独包裹起来,不要直接在一行中连续加入c ...

  8. 写论文,没数据?R语言抓取网页大数据

    写论文,没数据?R语言抓取网页大数据 纵观国内外,大数据的市场发展迅猛,政府的扶持也达到了空前的力度,甚至将大数据纳入发展战略.如此形势为社会各界提供了很多机遇和挑战,而我们作为卫生(医学)统计领域的 ...

  9. 洛谷 P1858 多人背包 DP

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...

  10. Leetcode720.Longest Word in Dictionary词典中最长的单词

    给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无答案,则返回 ...