位置: 编程技术 - 正文

浅谈Node.js之异步流控制(node.js ejs)

编辑:rootadmin

推荐整理分享浅谈Node.js之异步流控制(node.js ejs),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs yield,node.js gui,node.js gui,node.js gui,nodejs异常处理,nodejs异步编程及原理,node.js异步编程,nodejs 异常,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的。由于Node.js独特的异步特性,才出现了“回调地狱”的问题,这篇文章中,我比较详细的记录了如何解决异步流问题。

文章会很长,而且这篇是对异步流模式的解释。文中会使用一个简单的网络蜘蛛的例子,它的作用是抓取指定URL的网页内容并保存在项目中,在文章的最后,可以找到整篇文章中的源码demo。

1.原生JavaScript模式

本篇不针对初学者,因此会省略掉大部分的基础内容的讲解:

(spider_v1.js)

上边的代码的流程大概是这样的:

把url转换成filename 判断该文件名是否存在,若存在直接返回,否则进入下一步 发请求,获取body 把body写入到文件中

这是一个非常简单版本的蜘蛛,他只能抓取一个url的内容,看到上边的回调多么令人头疼。那么我们开始进行优化。

首先,if else 这种方式可以进行优化,这个很简单,不用多说,放一个对比效果:

代码这么写,嵌套就会少一层,但经验丰富的程序员会认为,这样写过重强调了error,我们编程的重点应该放在处理正确的数据上,在可读性上也存在这样的要求。

另一个优化是函数拆分,上边代码中的spider函数中,可以把下载文件和保存文件拆分出去。

(spider_v2.js)

上边的代码基本上是采用原生优化后的结果,但这个蜘蛛的功能太过简单,我们现在需要抓取某个网页中的所有url,这样才会引申出串行和并行的问题。

(spider_v3.js)

上边的代码相比之前的代码多了两个核心功能,首先是通过辅助类获取到了某个body中的links:

内部实现就不解释了,另一个核心代码就是:

可以说上边这一小段代码,就是采用原生实现异步串行的pattern了。除了这些之外,还引入了nesting的概念,通过这是这个属性,可以控制抓取层次。

到这里我们就完整的实现了串行的功能,考虑到性能,我们要开发并行抓取的功能。

(spider_v4.js)

这段代码同样很简单,也有两个核心内容。一个是如何实现并发:

浅谈Node.js之异步流控制(node.js ejs)

上边的代码可以说是实现并发的一个pattern。利用循环遍历来实现。另一个核心是,既然是并发的,那么利用 fs.exists 就会存在问题,可能会重复下载同一文件,这里的解决方案是:

使用Map缓存某一url,url应该作为key

现在我们又有了新的需求,要求限制同时并发的最大数,那么在这里就引进了一个我认为最重要的概念:队列。

(task-Queue.js)

上边的代码就是队列的实现代码,核心是 next() 方法,可以看出,当task加入队列中后,会立刻执行,这不是说这个任务一定马上执行,而是指的是next会立刻调用。

(spider_v5.js)

因此,为了限制并发的个数,只需在 spiderLinks 方法中,把task遍历放入队列就可以了。这相对来说很简单。

到这里为止,我们使用原生JavaScript实现了一个有相对完整功能的网络蜘蛛,既能串行,也能并发,还可以控制并发个数。

2.使用async库

把不同的功能放到不同的函数中,会给我们带来巨大的好处,async库十分流行,它的性能也不错,它内部基于callback。

(spider_v6.js)

在上边的代码中,我们只使用了async的三个功能:

由于比较简单,就不做解释了。async中的队列的代码在(spider_v7.js)中,和上边我们自定义的队列很相似,也不做更多解释了。

3.Promise

Promise是一个协议,有很多库实现了这个协议,我们用的是ES6的实现。简单来说promise就是一个约定,如果完成了,就调用它的resolve方法,失败了就调用它的reject方法。它内有实现了then方法,then返回promise本身,这样就形成了调用链。

其实Promise的内容有很多,在实际应用中是如何把普通的函数promise化。这方面的内容在这里也不讲了,我自己也不够格

(spider_v8.js)

可以看到上边的代码中的函数都是没有callback的,只需要在最后catch就可以了。

在设计api的时候,应该支持两种方式,及支持callback,又支持promise

4.Generator

Generator很有意思,他可以让暂停函数和恢复函数,利用thunkify和co这两个库,我们下边的代码实现起来非常酷。

(spider_v9.js)

总结

我并没有写promise和generator并发的代码。以上这些内容来自于这本书nodejs-design-patterns 。

demo下载

标签: node.js ejs

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

上一篇:浅谈NodeJs之数据库异常处理(nodejss)

下一篇:Windows安装Node.js报错:2503、2502的解决方法(windows安装node)

  • PHP:pg_select()的用法_PostgreSQL函数

    PHP:pg_select()的用法_PostgreSQL函数

  • sql语句中单引号嵌套问题(一定要避免直接嵌套)(sql语句中单引号是什么)

    比如下面例子是存储过程里查询时的语句示例

    红色部分是会报错的,应该写成 @condition= 'ROOMTYPElike ‘ ‘%标准间%' ‘ ', 蓝色部分不是双引号,而是两个单引号

    谈谈sqlserver自定义函数与存储过程的区别 一、自定义函数:1.可以返回表变量2.限制颇多,包括不能使用output参数;不能用临时表;函数内部的操作不能影响到外部环境;不能通过select返回结果

    深入分析SqlServer查询计划 对于SQLServer的优化来说,优化查询可能是很常见的事情。由于数据库的优化,本身也是一个涉及面比较的广的话题,因此本文只谈优化查询时如何看懂SQ

    sql 判断字符串中是否包含数字和字母的方法 判断是否含有字母selectPATINDEX('%[A-Za-z]%',‘ads')=0(如果存在字母,结果1)判断是否含有数字PATINDEX('%[0-9]%',‘sdf" class="img-responsive" alt="sql语句中单引号嵌套问题(一定要避免直接嵌套)(sql语句中单引号是什么)">

    sql语句中单引号嵌套问题(一定要避免直接嵌套)(sql语句中单引号是什么)

  • MySQL外键使用及说明详解(mysql的外键)

    MySQL外键使用及说明详解(mysql的外键)

  • CentOS安装使用VeraCrypt及创建整个加密硬盘详解(centos安装问题)

    CentOS安装使用VeraCrypt及创建整个加密硬盘详解(centos安装问题)

  • onetouch.exe - onetouch是什么进程 有什么用

    onetouch.exe - onetouch是什么进程 有什么用

  • 纯脚本备份_还原驱动增强版附相关sleep.exe(rpg游戏脚本已经被备份)

    纯脚本备份_还原驱动增强版附相关sleep.exe(rpg游戏脚本已经被备份)

  • Shell脚本实现生成SSL自签署证书(shell脚本生成文件)

    Shell脚本实现生成SSL自签署证书(shell脚本生成文件)

  • jQuery EasyUi实战教程之布局篇(jquery easy ui)

    jQuery EasyUi实战教程之布局篇(jquery easy ui)

  • Windows下搭建python开发环境详细步骤(windows搭建python运行环境)

    Windows下搭建python开发环境详细步骤(windows搭建python运行环境)

  • 医疗费用收费票据
  • 生产成本月末有余额怎么结账
  • 农产进项税是多少税率
  • 应收账款贷方余额重分类到哪
  • 房地产开发企业土地增值税清算
  • 企业股权转让收入申报表填哪里
  • 股票收入要交税的后果有哪些
  • 没有按时缴纳税属于什么
  • 联营与参股公司的关系
  • 所得税按利润总额的25%计算缴纳
  • 企业预付的固定资产折旧
  • 核定征收的小规模企业优惠
  • rebootandselectproperbotdevice
  • 长期股权投资增加的原因
  • 融资租赁固定资产会计处理
  • 提供劳务收入怎么交税
  • PHP:class_parents()的用法_spl函数
  • PHP:oci_client_version()的用法_Oracle函数
  • 前期做了无票收入,后期怎么填写
  • 双线服务器
  • 自行建造完成交付的房子
  • 房产税的纳税申报与处理会计分录
  • php怎么发布
  • 克拉克湖国家公园
  • 努沙杜瓦酒店
  • 厂区绿化工程计入什么科目
  • monolog php
  • 尚融宝盈(宁波)投资中心(有限合伙)
  • 代收税款是什么意思
  • vue权限控制设计
  • find命令详解查找文件
  • vue开发小技巧
  • 其他权益工具投资
  • 小规模季报所得税不超多少不用交税
  • 增值税附加税有哪几种
  • 外贸企业收款有限额吗
  • 企业财政拨款所得免税吗
  • 对象是类的实例,一个对象必须属于一个已知的类
  • mysql表设计原则
  • 收到货款的会计分录怎么做账
  • 兼职属于劳务关系吗
  • 运输费用抵扣
  • 营业额包括成本价吗
  • 用sql语句查找年龄大于20
  • Win7 32/64位系统下安装SQL2005和SP3补丁安装教程[图文]
  • 企业自查补税怎么报税
  • 纸质专票红冲
  • 接受母公司捐赠现金分录
  • 小规模纳税人低于多少免征增值税
  • 什么情况下说免贵
  • 哪些固定资产不需要计提折旧
  • 在建工程领用原材料
  • 把公司设备操作坏了怎么担责
  • 新买固定资产怎么记账
  • 残疾人就业保障金征收使用管理办法
  • 房地产公司施工员
  • 成本与费用的区别联系
  • 建账的要点及应注意的问题
  • 怎样银行存款,预付帐款,应收帐款余额做资金平衡表
  • mysql的innodb和myisam
  • 安装sqlserver2008出现无法安装以下功能
  • win8怎么运行
  • solaris的多线程实现方式
  • cmdexe文件损坏
  • mac怎么设置开机默认windows
  • mac电脑文件夹怎么重命名
  • 在pc上安装了hp网络打印机需要注意什么
  • win10桌面图标排列设置
  • 零磁道的重要性
  • perl中哈希如何赋值
  • jQuery基于xml格式数据实现模糊查询及分页功能的方法
  • 酷狗模拟器
  • 使用Python对SQLite数据库操作
  • n归档是什么软件
  • 安卓手机管家怎么关闭
  • python爬虫利器
  • 河南的省直
  • 一般纳税人租赁费税率
  • 2023年印花税税目表
  • 广东省电子税务局app
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设