位置: 编程技术 - 正文

JavaScript中的Promise使用详解(JavaScript中的数据类型)

编辑:rootadmin

推荐整理分享JavaScript中的Promise使用详解(JavaScript中的数据类型),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:JavaScript中的变量名不区分大小写,JavaScript中的数据类型分哪为两大类?,JavaScript中的数据类型分哪为两大类?,JavaScript中的this指向,JavaScript中的方法名不区分大小写,JavaScript中的变量名不区分大小写,JavaScript中的方法名不区分大小写,JavaScript中的NaN代表什么,内容如对您有帮助,希望把文章链接给更多的朋友!

许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures。JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口。 本文讲的是基于Promises/A 标准的JavaScript promises。 执行规则 多个远程验证 超时处理 远程数据请求 动画 将事件逻辑从应用逻辑中解耦 消除回调函数的恐怖三角 控制并行的异步操作

JavaScript promise是一个承诺将在未来返回值的对象。是具有良好定义的行为的数据对象。promise有三种可能的状态:

Pending(待定) Rejected(拒绝) Resolved(已完成)

一个已经拒绝或者完成的承诺属于已经解决的。一个承诺只能从待定状态变成已经解决的状态。之后,承诺的状态就不变了。承诺可以在它对应的处理完成之后很久还存在。也就是说,我们可以多次取得处理结果。我们通过调用promise.then()来取得结果,这个函数一直到承诺对应的处理结束才会返回。我们可以灵活的串联起一堆承诺。这些串联起来的“then”函数应该返回一个新的承诺或者最早的那个承诺。通过这个样式,我们可以像写同步代码一样来写非同步代码。主要是通过组合承诺来实现:

堆栈式任务:多处散落在代码中的,对应同一个承诺。 并行任务:多个承诺返回同一个承诺。 串行任务:一个承诺,然后接着执行另一个承诺。 上面几种的组合。

为什么要这么麻烦?只用基本的回调函数不行吗?

回调函数的问题

回调函数适合简单的重复性事件,例如根据点击来让一个表单有效,或者保存一个REST调用的结果。回调函数还会使代码形成一个链,一个回调函数调用一个REST函数,并为REST函数设置一个新的回调函数,这个新的回调函数再调用另一个REST函数,依此类推。代码的横向增长大于纵向的增长。回调函数看起来很简单,直到我们需要一个结果,而且是立刻就要,马上就用在下一行的计算中。

我使用timeout来模拟异步操作。管理异常的方法是痛苦的,很容易玩漏下游行为。当我们编写回调,那么代码组织变得混乱。图2显示了一个模拟验证流可以运行在NodeJS REPL。在下一节,我们将从pyramid-of-doom模式迁移到一个连续的promise。

Figure

在NodeJS REPL执行的结果

我曾经遇到一个AngularJS动态验证的情况,根据对应表的值,动态的限制表单项的值。限制项的有效值范围被定义在REST服务上。

我写了一个调度器,根据请求的值,去操作函数栈,以避免回调嵌套。调度器从栈中弹出函数并执行。函数的回调会在结束时重新调用调度器,直到栈被清空。每次回调都记录所有从远程验证调用返回的验证错误。

我认为我写的玩意儿是一种反模式。如果我用Angular的$http调用提供的promise,在整个验证过程中我的思维会更近似线性形式,就像同步编程。平展的promise链是可读的。继续... 使用Promises

其中采用了kew promise库。Q库同样适用。要使用该库,首先使用npm将kew库导入到NodeJS,然后加载代码到NodeJS REPL。

Figure

JavaScript中的Promise使用详解(JavaScript中的数据类型)

输出和使用嵌套回调时相同:

该代码稍微“长高”了,但我认为更易于理解和修改。更易于加上适当的错误处理。在链的末尾调用fail用于捕获链中错误,但我也可以在任何一个then里面提供一个reject的处理函数做相应的处理。

服务器 或 浏览器

Promises在浏览器中就像在NodeJS服务器中一样有效。下面的地址, JSFiddle所有的代码是可修改的。我故意操作随意动作。你可以试几次得到相反的结果。它是可以直接扩展到多个promise链, 就像前面NodeJS例子。

并行 Promises

考虑一个异步操作喂养另一个异步操作。让后者包括三个并行异步行为,反过来,喂最后一个行动。只有当所有平行的子请求通过才能通过。这是灵感来自偶遇一打MongoDB操作。有些是合格的并行操作。我实现了promises的流流程图。

我们怎么会模拟那些在该图中心行的并行promises?关键是,最大的promise库有一个全功能,它产生一个包含一组子promises的父promie。当所有的子promises通过,父promise通过。如果有一个子promise拒绝,父promise拒绝。

让十个并行的promises每个都包含一个文字promise。只有当十个子类通过或如果任何子类拒绝,最后的then方法才能完成。

Figure

下面的地址, Promise

许多api返回的promise都有一个then函数——他们是thenable。通常我只是通过then处理thenable函数的结果。然而,$q,mpromise,和kew库拥有同样的API用于创建,拒绝,或者通过promise。这里有API文档链接到每个库的引用部分。我通常不需要构造一个promise,除了本文中的包装promise的未知描述和timeout函数。请参考哪些我创建的promises。

Promise库互操作

大多数JavaScript promise库在then级别进行互操作。你可以从一个外部的promise创建一个promise,因为promise可以包装任何类型的值。then可以支持跨库工作。除了then,其他的promise函数则可能不同。如果你需要一个你的库不包含的函数,你可以将一个基于你的库的promise包装到一个新的,基于含有你所需函数的库创建的promise里面。例如,JQuery的promise有时为人所诟病。那么你可以将其包装到Q,$q,mpromise,或者kew库的promise中进行操作。 结语

现在我写了这篇文章,而一年前我却是犹豫要不要拥抱promise的那个。我只是单纯地想完成一项工作。 我不想学习新的API,或是打破我原来的代码(因为误解了promise)。我曾经如此错误地认为!当我下了一点注时,就轻易就赢得了可喜的成果。

在这篇文章中,我已经简单给出了一个单一的promise,promise链,和一个并行的promise的promise的的例子。 Promises不难使用。如果我可以使用它们,任何人都可以。 要查看完整的概念,我支持你点击专家写的参考指南。从Promises/A 的参考开始,从事实上的标准JavaScript的Promise 开始。

JavaScript面对国际化编程时的一些建议 什么是国际化?国际化(Internationalization的缩写是in——i,中间个字符,n)是将软件处理的能让来自各种地方使用各种语言的用户更简单使用的一个过

对JavaScript客户端应用编程的一些建议 你可能注意到了,最近的一段时间越来越多的Web应用有变复杂的趋势,重心从服务端慢慢向着客户端转移。这是个正常的趋势么?我不知道。支持和反

详解JavaScript的策略模式编程 我喜欢策略设计模式。我尽可能多的试着去使用它。究其本质,策略模式使用委托去解耦使用它们的算法类。这样做有几个好处。他可以防止使用大条

标签: JavaScript中的数据类型

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

上一篇:对JavaScript的全文搜索实现相关度评分的功能的方法(javascript的对象有哪些)

下一篇:对JavaScript客户端应用编程的一些建议(javascript在客户端执行)

  • 航天金税盘使用说明
  • 共享税种
  • 附加税税率是多还是少
  • 老板自己出钱买股票
  • 资产减值损失影响利润吗
  • 购销合同需要盖合同章吗
  • 小卖部的货源怎样提供的
  • 增票未抵扣丢失怎么处理
  • 执行企业会计准则第21号租赁的企业
  • 建筑业确认收入的时间是按进度计量么
  • 私募合伙企业收到投资款后退回,支付利息的会计处理
  • 会计大写数字金额书写规则
  • 代人开增值税怎么收费?
  • 无营业执照是否可以先办场所码
  • 递延收益摊销金额怎么算
  • 出差出了事故怎么处理
  • 生产企业电梯维修方案
  • 以库存现金代垫怎么做账
  • 其他贷款服务的内容包括
  • 哪些票据可以挂公司名下
  • 旅行社的税
  • 三证合一怎么查询
  • 小规模纳税人装修费用计入什么科目
  • 注册资本使用后账务如何处理
  • 房屋贷款基准利率表 历年查询
  • 计提法定盈余公积分录并结转
  • 广告费和业务宣传费
  • 增值税价外费用如何开票
  • 材料成本差异属于成本类账户吗
  • PHP:imagegrabscreen()的用法_GD库图像处理函数
  • 武陵山脉海拔
  • 委托贷款业务是资产业务吗
  • 圣米歇尔山法语介
  • 将织梦dedecms转换到wordpress
  • 论文implications
  • 用python编写素数
  • 应付职工薪酬总账和明细账
  • 税收分类口诀
  • 事业单位长期应付款呆账怎样处理好
  • access数据库修改字段类型
  • SQLServer2005 Output子句获取刚插入的ID值
  • Keepalived+HAProxy实现MySQL高可用负载均衡的配置
  • 认缴制下实收资本如何证明
  • 转账支付水电费
  • 增加固定资产原值
  • 固定资产溢余账务处理
  • 金税三期有什么用
  • 新会计准则贷款计提贷款减值准备的比例
  • 半成品加工需要什么手续
  • 房屋租赁费怎么记账
  • 附加税减免政策2023
  • 电子承兑汇票怎么查询
  • 异地缴纳增值税和附加税的区别
  • 什么叫系统服务
  • 航天信息服务费不交可以吗
  • 餐饮店原材料表格
  • 小规模企业购买车辆发票可以抵税吗
  • 总分类账与明细分类账的关系
  • sqlmap 提权
  • mysql的修改命令
  • win7硬盘设置在哪里设置
  • win2008下的HPC群集是什么有什么作用
  • win10桌面上图标
  • windows xp windows
  • Windows7忘记开机密码一键还原
  • reald是什么格式
  • linux中查看文件
  • 升级win10系统错误代码0x80072F8F
  • pe,翻译
  • unity shader editor
  • angularjs4
  • python字典合并 同key
  • 沧州地税局领导班子
  • 文化公司税务筹划
  • 稽查查补税款享受增值税免税优惠吗
  • 电子专票操作视频
  • 现在是一般纳税人,属于小规模发生的业务怎么开票
  • 西藏拉萨工业园主要生产什么
  • 个体办税控盘需要什么材料
  • 防伪开票系统操作流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设