位置: 编程技术 - 正文

深入浅析NodeJs并发异步的回调处理(nodejss)

编辑:rootadmin

推荐整理分享深入浅析NodeJs并发异步的回调处理(nodejss),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:简述nodejs,nodejs xhr,nodejs gulp,nodejs cgi,nodejs总结,nodejs cgi,nodejss,nodejss,内容如对您有帮助,希望把文章链接给更多的朋友!

这里说并发异步,并不准确,应该说连续异步。NodeJs单线程异步的特性,直接导致多个异步同时进行时,无法确定最后的执行结果来回调。举个简单的例子:

连续发起了5次读文件的异步操作,很简单,那么问题来了,我怎么确定所有异步都执行完了呢?因为要在它们都执行完后,才能进行之后的操作。相信有点经验的同学都会想到使用记数的方式来进行,但如何保证记数正确又是一个问题。仔细想想:

回调是一个函数,每个异步操作时将计数器+1,当每个异步结束时将计数器-1,通过判断计数器是否为0来确定是否执行回调。这个逻辑很简单,需要一个相对于执行时和回调时的全局变量作为计数器,而且要在传给异步方法是执行+1的操作,而且之后将返回一个用来回调的函数,有点绕,不过看看Js函数的高级用法:

当pending调用时,即pending(),比如:

这时计数变量count即被初始化为0,返回的函数附给了done,这时如果执行done(),会是什么?是不是直接执行pending返回的第一个函数,即:pending()(),这个执行又是什么,首先将计数变量count+1,又返回了一个函数,这个函数直接当做callback传给异步的方法,当执行这个callback的时候,首先是将计数变量count-1,再判断count是否为0,如果为0即表示所有的异步执行完成了,从而达到连续的异步,同一回调的操作。

关键就在两个return上,简单的说:

第一个return的函数是将count+1,接着返回需要回调的函数

第二个return的函数就是需要回调的函数,如果它执行,就是将count-1,然后判断异步是否全部执行完成,完成了,就回调

看个实际点的例子,读取多个文件的异步回调:

其中的done,即用pending方法包起了我们想回调执行的方法,当计数器为0时,就会执行它,那我们得改进一下pending方法:

callback即为我们的回调函数,当var done = pending(callback)时,done其实已为第一个return的函数,它有一个参数,可以当做返回的值的下标,所以在循环体中done(fileName[i]),把文件名传了进去。这个done()是直接执行的,它将count+1后,返回了要传给异步方法的回调函数,如前面所说,这个回调函数里会根据计数变量来判断是否执行我们希望执行的回调函数,而且把文件的内容传给了它,即returns。好了,运行一下,相信能够准确的看到运行结果。

done{"1.html": "xxx", "2.html": "xxx", "3.html": "xxx"}

深入浅析NodeJs并发异步的回调处理(nodejss)

从计数上明显能看出,从0-3再到0,之后就是我们的回调函数输出了done和文件的内容。

这个问题解决了,我们要思考一下,如何让这样的方法封装重用,不然,每次都写pending不是很不科学吗?

下面看看UnJs(我的一个基于NodeJs的Web开发框架)的处理方式,应用于模板解析中的子模板操作:

asyncSeries有三个参数,意思是:

task: 需要处理的对象,比如需要读取的文件,它是一个列表,如果不是列表,或列表长度为0,它将不会执行

func: 异步方法,比如fs.readFile,就是通过它传进去的

callback: 我们希望回调的方法

done和前面同理,它传给了func,但并没有执行,因为希望应用端能可控制参数,所以让应用端去执行。

再看看处理子模板时的操作:

subTemplate这个列表,是根据对子模板的解析生成的数据,它是一个二维的数组,每个子项的第一个值为子模板的调用文本,即:{% include 'header.html' %}这样的字符串,第二个参数为子模板文件名,即:header.html

asyncSeries的第二个参数是的callback,实际上是第三个参数,也就是我们希望执行的回调函数经过pending处理的回调方法,如前面所说,在asyncSeries内部,它并没有运行,而是到这里运行的,即:callback(item[0]),带上了参数,因为后面还要根据这个参数将父模板中调用子模板的字符串替换为对应子模板的内容。

这样子,只要需要连续异步时,就可以使用asyncSeries方法来处理了。因为异步的关系,程序的流程有点绕,可能开始不太好理解,即使熟悉了,也有可能突然想不明白,没关系,比如,第二个参数中的callback实际是第三个参数生成的,开始可能你就会想,这个callback倒底是啥。还有就是pending的两个return,也是不太好理解的,需要多想想。

好了,连续异步的回调使用Js函数的高级特性完成了。但NodeJs的异步性着实让程序的控制很成问题,诸如还有连续异步,但要传值的操作等,这些都是可以通过这样的思路,变化一下即可实现的。

以上内容是小编给大家分享的NodeJs并发异步的回调处理的相关知识,希望大家喜欢。

node.js入门实例helloworld详解 本文实例讲述了node.js入门实例helloworld。分享给大家供大家参考,具体如下:将下面的代码保存为:server.js存到E盘下面的node目录中。varhttp=require('http');f

Nodejs express框架一个工程中同时使用ejs模版和jade模版 在某些项目中,比如你接手了一个别人的项目然后你不想用蛋疼的ejs,或者你不想用蛋疼的jade。你有不想重写之前的页面,那么你现在可能需要新引入e

学习使用grunt来打包JavaScript和CSS程序的教程 Java世界里的Maven提供了强大的包依赖管理和构建生命周期管理。在JavaScript的世界里,随着Node.js的流行,JavaScript原生的构建工具已经成为可能。Grunt.js是

标签: nodejss

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

上一篇:深入浅析Node.js 事件循环(node.js gui)

下一篇:node.js入门实例helloworld详解(node.js基础入门)

  • 增值税有哪些二类税种
  • 企业所得税怎么做账
  • 小规模纳税人劳务费税率1%
  • 桥闸通行费怎么做账务处理
  • 对公付款对方不开发票怎么处理
  • 合同负债属于负债吗
  • 网银年费怎么做会计分录的
  • 统驭科目的作用
  • 小企业会计准则适用于哪些企业
  • 如何确定电动车电池是新电池
  • 如何在电子税务局开发票
  • 申请增值税专用发票需要什么资料
  • 企业应收票据贴现给银行所获得的现金计入现金流量表
  • 电子商业承兑对方接收了还可以作废吗
  • 收到社保补差款怎么办
  • 公司注销取不到采购发票怎么汇算清缴?
  • 小型微利企业所得税优惠政策
  • 其他服务业经营范围包括哪些
  • 新办企业注册资本和投资总额
  • 增值税税控系统专用设备
  • 包装物怎么入账
  • PRISMSTA.EXE - PRISMSTA是什么进程 有什么用
  • 支付到期的承兑汇票是大额往来吗
  • 零售业收入
  • 公司支出的消防费用
  • windows11怎么添加打印机驱动
  • PHP:Memcached::quit()的用法_Memcached类
  • 应收账款保理的主要意图在于
  • codeigniter3中文手册
  • 甲产品生产耗用a材料10000千克,单位成本
  • centos下file_put_contents()无法写入文件的原因及解决方法
  • 个税系统怎么查询已申报个人明细
  • 财政拨款结转的二级科目有哪些
  • 先开发票还是先收钱
  • 个人在平台销售怎么做
  • dom事件种类
  • 学习笔记——Servlet
  • mongodb中主键的默认格式是哪个?
  • 特殊工种人身安全责任书
  • 销售部门发生的商品维修费
  • 什么情况下需要做心脏造影
  • 电子发票应如何打印出来
  • 商贸公司成本大吗
  • 固定资产折旧的影响因素
  • 物资采购是
  • 公司跟个体户的税收
  • 合并财务报表内部交易抵消顺流和逆流
  • 承兑贴现个人违法吗
  • 销售边角废料属于什么
  • 申请国家知识产权的条件
  • 定额发票收入怎么样确定
  • 库存商品与存货总额之比
  • 未实现融资收益借贷方向
  • 纳税人可以委托税务人员办理纳税申报吗
  • 防御sql注入的方法有哪几种
  • sqlserver 错误6005
  • window系统怎么更新版本
  • win10预览版bug
  • win10联想笔记本还原系统
  • linux怎么恢复数据
  • linux的shm共享内存
  • dos批处理高级教程合编.pdf
  • 详细分析我国针对疫情的国防动员举措
  • Android studio配置环境
  • python读取grib
  • js启动
  • 如何查看驱动器
  • js中check
  • javascript边框
  • New AssetBundle build system in Unity 5.0
  • unity ugui源码
  • 走出JavaScript初学困境—js初学
  • unity多开同一个项目的方法
  • jQuery插件封装时如要实现链式编程,需要
  • python 网络编程总结
  • python如何自动化
  • 电子税务局个体工商户如何登陆
  • a级纳税人和一级的区别
  • 购买烟叶要交烟税吗
  • 合肥哪里可以注销电信卡
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设