位置: 编程技术 - 正文

剖析Node.js异步编程中的回调与代码设计模式(nodejs 异步)

编辑:rootadmin

推荐整理分享剖析Node.js异步编程中的回调与代码设计模式(nodejs 异步),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs异步原理,node中异步编程模式使用什么捕获异常,nodejs异步处理执行顺序,node 异步,nodejs 异步,nodejs 异步,node.js异步编程,node.js异步编程,内容如对您有帮助,希望把文章链接给更多的朋友!

NodeJS 最大的卖点——事件机制和异步 IO,对开发者并不是透明的。开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些 NodeJS 反对者的抨击。但不管怎样,异步编程确实是 NodeJS 最大的特点,没有掌握异步编程就不能说是真正学会了 NodeJS。本章将介绍与异步编程相关的各种知识。

在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。我们首先可以看看以下代码。

可以看到,以上代码中的回调函数仍然先于后续代码执行。JS 本身是单线程运行的,不可能在一段代码还未结束运行时去运行别的代码,因此也就不存在异步执行的概念。

但是,如果某个函数做的事情是创建一个别的线程或进程,并与JS主线程并行地做一些事情,并在事情做完后通知 JS 主线程,那情况又不一样了。我们接着看看以下代码。

这次可以看到,回调函数后于后续代码执行了。如同上边所说,JS 本身是单线程的,无法异步执行,因此我们可以认为 setTimeout 这类 JS 规范之外的由运行环境提供的特殊函数做的事情是创建一个平行线程后立即返回,让 JS 主进程可以接着执行后续代码,并在收到平行进程的通知后再执行回调函数。除了 setTimeout、setInterval 这些常见的,这类函数还包括 NodeJS 提供的诸如 fs.readFile 之类的异步 API。

另外,我们仍然回到 JS 是单线程运行的这个事实上,这决定了 JS 在执行完一段代码之前无法执行包括回调函数在内的别的代码。也就是说,即使平行线程完成工作了,通知 JS 主线程执行回调函数了,回调函数也要等到 JS 主线程空闲时才能开始执行。以下就是这么一个例子。

可以看到,本来应该在1秒后被调用的回调函数因为 JS 主线程忙于运行其它代码,实际执行时间被大幅延迟。

代码设计模式异步编程有很多特有的代码设计模式,为了实现同样的功能,使用同步方式和异步方式编写的代码会有很大差异。以下分别介绍一些常见的模式。

函数返回值使用一个函数的输出作为另一个函数的输入是很常见的需求,在同步方式下一般按以下方式编写代码:

而在异步方式下,由于函数执行结果不是通过返回值,而是通过回调函数传递,因此一般按以下方式编写代码:

可以看到,这种方式就是一个回调函数套一个回调函多,套得太多了很容易写出>形状的代码。

剖析Node.js异步编程中的回调与代码设计模式(nodejs 异步)

遍历数组在遍历数组时,使用某个函数依次对数据成员做一些处理也是常见的需求。如果函数是同步执行的,一般就会写出以下代码:

如果函数是异步执行的,以上代码就无法保证循环结束后所有数组成员都处理完毕了。如果数组成员必须一个接一个串行处理,则一般按照以下方式编写异步代码:

可以看到,以上代码在异步函数执行一次并返回执行结果后才传入下一个数组成员并开始下一轮执行,直到所有数组成员处理完毕后,通过回调的方式触发后续代码的执行。

如果数组成员可以并行处理,但后续代码仍然需要所有数组成员处理完毕后才能执行的话,则异步代码会调整成以下形式:

可以看到,与异步串行遍历的版本相比,以上代码并行处理所有数组成员,并通过计数器变量来判断什么时候所有数组成员都处理完毕了。

异常处理JS 自身提供的异常捕获和处理机制——try..catch..,只能用于同步执行的代码。以下是一个例子。

可以看到,异常会沿着代码执行路径一直冒泡,直到遇到第一个 try 语句时被捕获住。但由于异步函数会打断代码执行路径,异步函数执行过程中以及执行之后产生的异常冒泡到执行路径被打断的位置时,如果一直没有遇到 try 语句,就作为一个全局异常抛出。以下是一个例子。

因为代码执行路径被打断了,我们就需要在异常冒泡到断点之前用 try 语句把异常捕获住,并通过回调函数传递被捕获的异常。于是我们可以像下边这样改造上边的例子。

可以看到,异常再次被捕获住了。在 NodeJS 中,几乎所有异步 API 都按照以上方式设计,回调函数中第一个参数都是 err。因此我们在编写自己的异步函数时,也可以按照这种方式来处理异常,与 NodeJS 的设计风格保持一致。

有了异常处理方式后,我们接着可以想一想一般我们是怎么写代码的。基本上,我们的代码都是做一些事情,然后调用一个函数,然后再做一些事情,然后再调用一个函数,如此循环。如果我们写的是同步代码,只需要在代码入口点写一个 try 语句就能捕获所有冒泡上来的异常,示例如下。

但是,如果我们写的是异步代码,就只有呵呵了。由于每次异步函数调用都会打断代码执行路径,只能通过回调函数来传递异常,于是我们就需要在每个回调函数里判断是否有异常发生,于是只用三次异步函数调用,就会产生下边这种代码。

可以看到,回调函数已经让代码变得复杂了,而异步方式下对异常的处理更加剧了代码的复杂度。

解析Node.js异常处理中domain模块的使用方法 NodeJS提供了domain模块,可以简化异步代码的异常处理。在介绍该模块之前,我们需要首先理解域的概念。简单的讲,一个域就是一个JS运行环境,在一个

nodejs修复ipa处理过的png图片 最近做项目遇到一个需求:解析apk和ipa包,然后把里面的icon上传到服务器。问题解析上传过程比较简单,我使用JSZip对apk和ipa进行解压,然后把找到里

Node.js开发者必须了解的4个JS要点 本文为开发者总结了4个Node.js要点。1.非阻塞(Non-blocking)或异步I/O由于Node.js一个服务器端框架,所以它主要工作之一是处理浏览器请求。在传统的I/O系统

标签: nodejs 异步

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

上一篇:使用Node.js处理前端代码文件的编码问题(node.js怎么用)

下一篇:解析Node.js异常处理中domain模块的使用方法(node解析前端formdata数据)

  • 小微企业所得税优惠政策最新2022
  • 小规模纳税人定期定额征收的怎么报税
  • 评估增值对净利有影响吗
  • 科研材料怎么买
  • 跨年度费用报销违反什么规定
  • 加盟费摊销会计分录
  • 专利权转让的净收益计入
  • 律师要钱吗
  • 软件开发公司的运营模式
  • 境外公司委托境内公司提供劳务
  • 个体工商户个人经营所得税优惠政策
  • 印花税按次申报是什么意思
  • 公司收到保险公司的理赔款怎么做分录
  • 工商年报报表
  • 企业所得税视同销售的捐赠扣除
  • 为什么增值税不影响利润
  • 承兑汇票贴单怎么贴
  • 财报申报逾期可不可以补报
  • 纳税单位与免税单位共用的房屋由纳税单位全额纳税
  • 承兑汇票如何背书转让
  • 购材料有折让如何做会计分录?
  • 劳务公司差额发票账务处理
  • 资产总额和净资本的关系
  • win10系统中怎么共享文件
  • 资产负债表的资产总额怎么看
  • 在建工程转固定资产后如何计提折旧
  • ubuntu系统u盘安装
  • 如何将win11任务栏变小一点
  • 银行对公账户收款码手续费多少
  • 补缴增值税和滞纳税区别
  • 委托外部加工材料支付加工费计入
  • 会计账簿的启用规则
  • php文件上传用什么请求方法
  • 如何写php守护进程数据
  • 调整以前年度亏损
  • 土地价款会计分录
  • 程序员未来会失业吗
  • yolov5l
  • Deep Learning Tuning Playbook(深度学习调参手册中译版)
  • 浅谈建筑地基基础加固施工技术亲
  • 其他非流动资产是会计科目吗
  • 帝国cms怎么调用文章随机段落
  • phpcms添加内容
  • 建筑企业未按规定预缴增值税
  • ubuntu系统安装教程
  • 换电脑了怎么办
  • 车补贴是要缴纳增值税吗
  • 法人股东分红是否免税
  • 安装sql server 2008硬件要求
  • 待处理财产损益是什么类科目借贷方向
  • 减免的企业所得税是否需要征税 税屋
  • 长期股权投资稀释股权的两种
  • 百旺购货方红字信息表怎么开具
  • 购买增值税发票系统金税盘如何入账?
  • 小规模纳税人购进税控设备如何抵扣
  • 交易的价格
  • 信用担保融资的缺点
  • 为什么需要会计信息
  • 现金日记账怎么填写规范
  • 设置动态壁纸来电铃声
  • win10安装更新
  • windows xp 任务栏在右边
  • win10系统自带
  • SmoothView.exe - SmoothView是什么进程
  • win10预览版退回正式版
  • linux集群的作用和意义
  • linux阅读器
  • win10系统如何解除屏保
  • cocos2d js教程
  • 简单的安卓程序
  • centos 设置定时任务执行指定脚本的方法
  • 正则化实现
  • javascript如何学
  • 电子税务局更改密码怎么改
  • 社保每个月几号截止申报
  • 单张发票开票限额?
  • 加强税务系统党委全面监督工作
  • 所属税务局怎么填写
  • 税务申报热线电话
  • 税务约谈的法律依据
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设