位置: 编程技术 - 正文

详解js的异步编程技术的方法(详解js的异步编码)

编辑:rootadmin

推荐整理分享详解js的异步编程技术的方法(详解js的异步编码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js异步实现原理,详解js的异步编号,详解js的异步编号,js异步编程的四种方法,详解js的异步编程,详解js的异步编程,js的异步编程,详解js的异步编程,内容如对您有帮助,希望把文章链接给更多的朋友!

基于浏览器的事件轮询机制(以及Node.js中的事件轮询机制),JavaScript常常会运行在异步环境中。由于JavaScript本身语言的特性(不需要程序员操控线程/进程),在js中解决异步化编程的方法就显得相当重要。可以说一个完整的项目中,js开发人员是不可能不面对异步操作的。本文将详细介绍几种经典JavaScript异步编程串行化方法,同时也将简单介绍一下ES6提供的Promise顺序执行方法。

一.回调函数

(1)经典回调函数方式:嵌套内联函数

假设我们有一个ajax()方法,他接收一个url参数,向该地址发起一个异步请求,在请求结束时执行第二个参数—一个回调函数:

可以说这种方式几乎是每个前端开发人员都用过的回调函数方式,有了这样的回调机制,开发人员就不用编写类似下面这样的代码来推测服务器请求什么时候返回:

大家应该能明白我此处想表达的意思。我们设置了一个延迟毫秒的定时器,来假设我们发出的ajax请求会在毫秒之内完成。否则,我们将会操作一个undefined的result。

但是有一个问题随着项目的扩大渐渐浮现出来:如果场景需要我们多层嵌套回调函数,代码将变得难以阅读和维护:

(2)调用外部函数

为了解决内联回调函数暴露出来的代码混乱问题,我们引入外部函数调用来解决类似问题:

通过这种拆分内联函数,来调用外部函数的优化方法,能极大的保持代码的简洁性。

二.制定回调管理器

观察流行的JavaScript流程控制工具,例如Nimble、Step、Seq,我们会学习到一种简洁的设计模式:通过回调管理器来控制异步JavaScript执行流程,下面是一个典型的回调管理器的关键代码示例:

详解js的异步编程技术的方法(详解js的异步编码)

我们初始化了一个Flow控制器,为他设计了series和next两个函数属性。在我们编写的业务方法内部,在方法结尾处通过调用Flow.next()的方式来顺序触发下一个方法;通过执行series方法来顺序执行异步函数。这种通过核心控制器来管理异步函数调用的方式简化了我们的编程过程,让开发人员能够投入更多精力在业务逻辑上。

三.全局标记控制

(1)简单计数器控制

也许上面介绍的异步方法仍然不能满足实际开发中的业务场景:假设我们有a(),b(),c()三个方法,a和b没有依赖关系,可以异步进行。但是c必须在a和b都完成之后才能触发。为满足这样的逻辑实现,我们加入一个全局计数器来控制代码的执行流程:

我们设置了一个全局变量flag来监控方法a和方法b的完成情况。方法b通过设置一个毫秒的定时器来模拟网络环境,最终会在b方法执行完成之后成功调用c方法。这样我们就实现了对方法a(),b(),c()的依赖调用。

(2)面向数据的控制

当上述方案在复杂场景下应用时,会出现如下问题:产品经过多个版本迭代,c方法依赖更多的方法,因此计数器flag需要不断的变化;产品迭代过程中更换了开发人员。当出现上述两种情况时,代码的逻辑将会变得混乱不堪,flag标记符是否能保持简明正确很大程度上受到了产品迭代的影响。因此我们提出面向数据的优化改进。

在真实的开发场景中,存在方法依赖的原因基本都是因为存在数据依赖,对于上面那个简单的示例:c方法依赖于a方法和b方法操作的结果,而不是依赖于flag是否为0。因此我们可以通过检查依赖方法是否已经完成了数据处理来代替检查标记符是否已经被置为0,在这个例子中也就是在c方法中检查aValue和bValue是否已经完成了赋值:

针对更加通用的场景,我们将上述代码修改为下:

通过面向数据的检查方式,未来扩展时,我们仅需要在新增的方法中增加对checkDependency对象的修改,并且在c方法中检查相应属性的存在就能实现异步依赖方法的顺序执行。

四.ES6新增方法—Promise类

为了解决JavaScript中异步方法的复杂性,官方引入了一种统一的控制方式:

上例代码展示了一个基础的Promise应用,也许实际场景中更加多见的是下面这种链式调用:

如果对Promise感兴趣的话,可以在网上寻找资料继续深入学习!

关于Promise的兼容性,通常web前端JavaScript代码中不会直接使用Promise(通过caniuse.com网站查询发现Android4.4不支持Promise)。如果特别想使用的,往往会在项目中附带一些补足兼容性的promise类库;而后端Node.js可以放心使用Promise类来管理异步逻辑。

标签: 详解js的异步编码

本文链接地址:https://www.jiuchutong.com/biancheng/376048.html 转载请保留说明!

上一篇:javascript判断回文数详解及实现代码(javascript的判断语句)

下一篇:简单谈谈Javascript函数中的arguments(简单谈谈对电信的认识)

  • 个人开具服务费发票税率
  • 残疾人保证金计算器
  • 企业所得税如何合理避税?
  • 回购股票为什么股价下跌
  • 装修及室内设计实训报告
  • 出借包装物收到押金
  • 开增值税发票规格是否可以不用填
  • 车间用的电线计入什么科目
  • 汽车4s店索赔和维修
  • 生产车间的修理计入什么科目
  • 工业总产值怎么计算公式
  • 增值税补交还有没有责任
  • 工程维修费用怎么入账
  • 预支的采购备用金是什么
  • 房地产公司要做数据分析吗
  • 父母的股权给子女可以怎样认证
  • 其他服务费包括哪些内容
  • 营改增之后税务是否可以征收入库?
  • 营改增对象
  • 农民专业合作社普通发票抵扣
  • 分公司利润如何分红
  • 试用期可以不交五险一金吗
  • 业委会是否要交税
  • 给子公司拨款怎么记账
  • 企业收入不进公账怎样做账?
  • 预付款比例怎么算
  • 苹果电脑初始化设置
  • 付临时工工资计入什么科目
  • 一般纳税人的月报,季报年报
  • 股利分配账务处理
  • 绝地求生闪退怎么解决win10
  • MacOS X Yosemite升级后postgresql启动报错的解决办法
  • 超市收取进场费违反什么法律
  • shstart.exe - shstart是什么进程 有什么用
  • 无形资产的摊销年限不得低于多少年
  • 会计凭证设计要注意的问题
  • 伯里圣埃德蒙兹的人口
  • vue2和vue3区别面试题
  • 使用灭火器人要站在上风口还是下风口
  • 【JavaScript 刨根问底之】requestAnimationFrame以及延时器
  • 金融机构贷款准备金
  • 没有发票以及收款怎么办
  • 递延所得税的会计应用
  • 税前扣除是什么时候
  • 特种设备年检费怎么开具发票
  • 2022年最新办公用房标准
  • 出口发票已经抵扣认证怎么办
  • 政府补贴需要还吗
  • 计入当期损益的
  • linux 升级软件
  • 销售会计的岗位职责有哪些
  • 已计提的城建税有误,怎么办
  • 社保里面的住房公积金买房可以便宜多少
  • 应收账款未计提坏账能直接核销
  • 营业外支出是什么类账户
  • 房地产公司属于什么企业
  • 银行结息需要开发票吗
  • 会计凭证负数金额怎么算
  • 工程预交税金是什么意思
  • 购买设备的运费增值税计入成本吗
  • mysql安装配置教程5.7.16
  • win8如何快速启动
  • 微软10月已停止服务中国用户
  • solaris newfs
  • win10如何创建系统分区
  • windows10预览版是什么
  • 自定义ui界面
  • android环境搭建教程
  • perl中打开文件
  • Vuforia 4.0 beta——Object Recognition (三)
  • npm 发布组件
  • js正则匹配特殊符号
  • js effect
  • 学习jQuey中的return false
  • android界面设计规范
  • 浙江网上税务局登录官网
  • 外地经营预缴企业所得税
  • 上季度报表错误怎样更正
  • 增值税征税范围口诀
  • 成都网上税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设