位置: 编程技术 - 正文

NodeJS中利用Promise来封装异步函数(nodejs如何使用)

编辑:rootadmin

推荐整理分享NodeJS中利用Promise来封装异步函数(nodejs如何使用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs poll,nodejs protobuf,nodejs pool,node.js promise,nodejs promise用法,node.js promise,node.js promise,nodejs promise.all,内容如对您有帮助,希望把文章链接给更多的朋友!

在写Node.js的过程中,连续的IO操作可能会导致“金字塔噩梦”,回调函数的多重嵌套让代码变的难以维护,利用CommonJs的Promise来封装异步函数,使用统一的链式API来摆脱多重回调的噩梦。

  Node.js提供的非阻塞IO模型允许我们利用回调函数的方式处理IO操作,但是当需要连续的IO操作时,你的回调函数会多重嵌套,代码很不美观,而且不易维护,而且可能会有许多错误处理的重复代码,也就是所谓的“Pyramid of Doom”。

  这其实就是Node.js的Control flow的问题,对于这个问题,解决方案都许多,比如利用async,或者eventProxy等,不过本文的主题是利用CommonJs规范中对Promise来解决这个问题。

什么是Promise?

  CommonJs的Promise规范有许多种,我们一般讨论的是Promise/A+规范,它定义了Promise的基本行为。

  Promise是一个对象,它通常代表一个在未来可能完成的异步操作。这个操作可能成功也可能失败,所以一个Promise对象一般有3个状态:Pending,Fulfilled,Rejected。分别代表未完成、成功完成和操作失败。一旦Promise对象的状态从Pending变成Fulfilled或者Rejected任意一个,它的状态都没有办法再被改变。

  一个Promise对象通常会有一个then方法,这个方法让我们可以去操作未来可能成功后返回的值或者是失败的原因。这个then方法是这样子的:

promise.then(onFulfilled, onRejected)  显而易见的是,then方法接受两个参数,它们通常是两个函数,一个是用来处理操作成功后的结果的,另一个是用来处理操作失败后的原因的,这两个函数的第一个参数分别是成功后的结果和失败的原因。如果传给then方法的不是一个函数,那么这个参数会被忽略。

  then方法的返回值是一个Promise对象,这一个特点允许我们链式调用then来达到控制流程的效果。这里有许多细节上的问题,比如值的传递或者错误处理等。Promise的规范是这样定义的:

onFulfilled或者onRejected函数的返回值不是Promise对象,则该值将会作为下一个then方法中onFulfilled的第一个参数,如果返回值是一个Promise对象,怎么then方法的返回值就是该Promise对象onFulfilled或者onRejected函数中如果有异常抛出,则该then方法的返回的Promise对象状态转为Rejected,如果该Promise对象调用then,则Error对象会作为onRejected函数的第一个参数如果Promise状态变为Fulfilled而在then方法中没有提供onFulfilled函数,则then方法返回的Promise对象状态变为Fulfilled且成功的结果为上一个Promise的结果,Rejected同理。  补充一句,onFulfilled和onRejected都是异步执行的。

规范的实现:q

NodeJS中利用Promise来封装异步函数(nodejs如何使用)

  上面讲的是Promise的规范,而我们需要的是它的实现,q是一个对Promise/A+有着较好实现规范的库。

  首先我们需要创建一个Promise对象,关于Promise对象创建的规范在Promise/B中,这里不做详细的解释,直接上代码。

  多数Promise的实现在Promise的创建上大同小异,通过创建一个具有promise属性的defer对象,如果成功获取到值则调用defer.resolve(value),如果失败,则调用defer.reject(reason),最后返回defer的promise属性即可。这个过程可以理解为调用defer.resolve将Promise的状态变成Fulfilled,调用defer.reject将Promise的状态变成Rejected。

  在面对一系列连续的异步方法时,怎么利用Promise写出漂亮的代码呢?看下下面的例子。

  在上面的代码中,then方法只接受OnFulfilled,而catch方法实际上就是then(null, OnRejected),这样的话只要一系列异步方法只要始终是成功返回值的,那么代码就会瀑布式的向下运行,如果其中任意一个异步方法失败或者发生异常,那么根据CommonJs的Promise规范,将执行catch中的function。q还提供了finally方法,从字面上也很好理解,就是不论resolve还是reject,最终都会执行finally中的function。

  看上去似乎不错,代码更以维护且美观了,那么如果希望并发呢?

  q也为并发提供了api,调用all方法并传递一个Promise数组即可继续使用then的链式风格。还有像q.nfbind等可以将Node.js的原生API转化成Promise来统一代码格式也是挺好的。更多api在这里就不一一详述了。

结论

  本文主要介绍通过使用Promise来解决Node.js控制流问题,但Promise也可同样应用于前端,EMCAScript6已经提供了原生的API支持。需要指出的是Promise并不是唯一的解决方案,async也是一个很好的选择,并且提供更友好的并发控制API,不过我觉得Promise在封装具有异步方法的函数时更具优势。

好了,本文就先到这里了,希望对大家能够有所帮助。

nodejs中实现路由功能 初学Node,发现了与自己之前的观点完全不同的场面——你眼中的JavaScript,是干什么用的呢?特效?or只是与客户端的交互?可以说,JavaScript最早是运行

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例 每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者

Nodejs中读取中文文件编码问题、发送邮件和定时任务实例 关于nodejs读取中文文件真是折腾了不少时间,网上各种方案,最后没有一个适用我,好在解决了。下面的三个知识点都是从项目中抽出的,要单独运行

标签: nodejs如何使用

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

上一篇:NodeJS Web应用监听sock文件实例(node.js web)

下一篇:使用Jsoup 抓取页面的数据(页面抓取的流程是什么)

  • 分公司销售给总公司的印花税
  • 进项留抵转出会计分录
  • 即征即退的增值税属于政府补助
  • 小规模纳税人第一次网上报税
  • 某公司是一家刚成立的大型化妆品生产企业
  • 直系亲属之间转账要交税吗
  • 平价转让股权个税申报表填写
  • 公司宿舍房租
  • 资产已报废折旧怎么计算
  • 影院分成为什么那么高
  • 收到海外商务退税如何做账?
  • 增值税普通发票可以抵扣吗
  • 工会筹备金怎么改成工会经费
  • 企业并购重组有哪些
  • 销售额是含税价还是不含税
  • 基本社会保障性缴款包括什么
  • 电脑看电影开全屏画面会迟钝是什么原因
  • 生产成本是什么类科目
  • 如何结转销售收入
  • 公司之间往来借款利息怎么记账
  • 企业所得税汇算清缴补缴税款分录
  • 物业专项维修资金可以退还吗
  • 总公司人员的工资子公司可以发吗
  • linux操作系统有哪些版本
  • rds selected
  • php数组函数输出《咏雪》里有多少"片"字
  • 运输发票符合什么要求
  • synaudsrv.exe是什么
  • 多对账工作的主要内容
  • 跨国公司外汇资金集中
  • 集团关联企业间关联交易对账单
  • 前端几种下载文件
  • 购买办公用品入库如何做账务处理
  • 基于Java+SpringBoot+Vue+uniapp微信小程序零食商城系统设计和实现
  • web前端性能响应时间
  • 房地产代理公司资质证书
  • 企业注销时实收资本清算时要作资产处置收益交所得税吗
  • 手机话费怎么打发票
  • 织梦模板如何安装
  • 终止劳动合同赔偿N+1
  • 收到税务局退税怎么入账
  • 应收账款收不回来做坏账处理分录
  • 代征税款手续费规定
  • 无形资产一般包括哪些权利
  • 企业所得税汇算清缴操作流程
  • 应交税费企业所得税科目
  • 中秋福利做账
  • 长期股权投资与其他权益工具投资的区别
  • 委托加工存货收回后直接用于销售的账务处理
  • 利润总额是负数怎么计算利润率
  • 公司租用房屋用交房产税吗
  • 高新技术企业进项税加计扣除10%如何填企业所得税季报
  • 纳税人缴纳的工资怎么查
  • 工程款项目的发包人是谁
  • 用友为什么引入不了账套
  • 外经证是干什么用的
  • sql2005 HashBytes 加密函数
  • windows update client
  • 苹果系统最新版本
  • bboy.exe进程是病毒吗 bboy进程安全吗
  • windows注销登录会怎样
  • win7旗舰版显示不全屏
  • 如何注销windows账户登录
  • CentOS中-bash: lsb_release: command not found错误的解决方法
  • win8怎么禁止弹窗
  • win7系统怎么设置桌面便签
  • linux历史操作
  • virtualbox装linux
  • python图论算法
  • cocos2dx 4.0更新内容
  • unity怎么用
  • 由浅入深易,由深入浅难
  • AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
  • Linux 中的各项 CPU 利用率是这样算出来的
  • 安卓状态栏宽度
  • 河南省地方税务局公告2017年第4号
  • 运费没有发票怎么报销
  • 江苏网上税务局官网
  • 税务上的关联企业指哪些
  • 国企残疾职工安置
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设